很多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有没有一个比较标准的解决方案?
谢谢。
--
FROM 210.22.179.*