- 主题:包装c的handle时有没有比较好的标准做法。
你先想想为什么要在堆上构造。一般来说,为了实现不确定的(非lexical的)lifetime,对吧?
那么,不在堆上分配空间,仅靠指针,能实现不确定的lifetime吗?这个指针变量的lifetime是怎样的?
【 在 Madlee 的大作中提到: 】
: 很多C的API都会提供一对 构造/析构的函数,然后返回一个指针做 handle。
: 然后标准做法的 C++封装就是把这个handle作为类的一个成员。
: 比如最近在搞hiredis,redisRelpy*就是这么个东西。
: ...................
--
修改:ilovecpp FROM 124.78.175.*
FROM 124.78.175.*
这两个不要混在一起讲。
unique_ptr的作用是把non-lexical lifetime转换成lexical lifetime。很多时候,是因为对象大小不确定,无法直接在栈上构造。
你的wrapper明明可以直接栈上构造,搞什么unique_ptr? 实现move ctor就行了。
shared_ptr所指向的对象的lifetime显然是超过单个shared_ptr的lifetime的。这个对象显然应该在堆上,而不是嵌入在shared_ptr对象里。能节省一点内存的,无非是把counter和所指对象分配在一起,std::make_shared.
你说我的wrapper是immutable,所以我非要只在堆上分配counter,wrapper我每个shared_ptr存一份拷贝,理论上也不是不行,最好别折腾shared_ptr,你自己实现一个专用的指针好了。
【 在 Madlee 的大作中提到: 】
: 丢给unique_ptr, shared_ptr之类的智能指针去管理啊。
: 就是希望能在不增加overhead的情况下能c++的智能指针去管理。
--
修改:ilovecpp FROM 124.78.175.*
FROM 124.78.175.*
【 在 Madlee 的大作中提到: 】
: 有很多地方需要允许在堆上构造啊,比如放到std容器里,光靠 move ctor不行吧?
: 他怎么能自动析构呢?
是可以的。unique ptr无非也就是movable,有什么区别?
: 当然,自己写个ptr也不是不可以,但能懒就懒,毕竟先出活比搞个很fancy的实现更重要啊。
shared ptr的counter其实本来就很大,多你一个handle不多。你计较这点儿本身就和出活没什么关系。
--
FROM 124.78.175.*