相关疑难解决方法(0)

make shared_ptr不使用delete

在我的代码中,我希望boost :: shared_ptr不要调用delete但是调用ptr-> deleteMe()代替.

我还有一些C风格的函数返回一个ptr.我可以调用lib_freeXYZ(ptr); 而不是试图删除?

c++ boost

41
推荐指数
3
解决办法
2万
查看次数

如果没有更多引用,如何从缓存中删除(非侵入式)智能指针?

由于我的noob声誉,我无法回复此主题,特别是接受的答案:

我从未使用过boost :: intrusive智能指针,但如果你使用shared_ptr智能指针,你可以使用weak_ptr对象作为缓存.

当系统决定释放内存时,那些weak_ptr指针不算作引用,但只要该对象尚未被删除,它就可用于检索shared_ptr.

这当然是一个直观的想法,但是,C++标准不支持weak_ptrs的比较,因此它不能用作关联容器的键.这可以通过为weak_ptrs实现比较运算符来规避:

template<class Ty1, class Ty2>
    bool operator<(
        const weak_ptr<Ty1>& _Left,
        const weak_ptr<Ty2>& _Right
    );
Run Code Online (Sandbox Code Playgroud)

这个解决方案的问题是

(1)比较运算符必须获得每次比较的所有权(即从weak_ptr refs创建shared_ptrs)

(2)当管理资源的最后一个shared_ptr被破坏时,weak_ptr不会从缓存中删除,但是过期的weak_ptr会保留在缓存中.

对于(2),我们可以提供自定义析构函数(DeleteThread),但是,这将需要再次从要删除的T*创建weak_ptr,然后可以使用它从缓存中擦除weak_ptr.

我的问题是,如果有更好的方法使用智能指针缓存(我使用VC100编译器,没有提升),或者我根本没有得到它?

干杯,丹尼尔

c++ caching smart-pointers shared-ptr weak-ptr

14
推荐指数
1
解决办法
1581
查看次数

标签 统计

c++ ×2

boost ×1

caching ×1

shared-ptr ×1

smart-pointers ×1

weak-ptr ×1