【 在 Madlee (无竹居士) 的大作中提到: 】
: 标 题: 包装c的handle时有没有比较好的标准做法。
: 发信站: 水木社区 (Thu Aug 27 10:12:58 2020), 站内
:
: 很多C的API都会提供一对 构造/析构的函数,然后返回一个指针做 handle。
:
: 然后标准做法的 C++封装就是把这个handle作为类的一个成员。
: 比如最近在搞hiredis,redisRelpy*就是这么个东西。
:
:
: class RedisReply {
: public:
: RedisReply(redisReply* p)
: : _handle(p)
: { }
:
: ~RedisReply(){
: freeReplyObject(_handle);
: }
:
: private:
: redisReply* _handle;
:
: };
:
:
: 这么做在栈上构造的时候,问题不大,但是如果需要在堆上构造的时候,需要new
: 一个新对象,然后这个新对象又仅仅只保存一个指针,效率其实是非常低的。
为什么会需要在堆上构造?
:
: 那么有没有办法把这个对象去掉呢?比如这样通过reinterpret_cast把redisReply*
: 强制转换成RedisReply*,然后函数调用的时候直接用this作为原始指针用。
:
: class RedisReply {
: private:
: RedisReply()
: { }
: public:
: static RedisReply* create(redisReply* p) {
: return reinterpret_cast<RedisReply*>(p);
: }
:
: public:
: ~RedisReply(){
: freeReplyObject(reinterpret_cast<redisReply*>(this));
: }
: };
:
:
: 我希望把这个对象的指针能传给std::unique_ptr<RedisReply>,但由于
: 这个对象不是new出来的,所以delete的时候怕会有问题。
:
: 象类似这样的issue有没有一个比较标准的解决方案?
:
: 谢谢。
:
:
:
: --
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 210.22.179.*]
--
FROM 76.126.252.*