在shared_ptr中引用次数减少时运行函数

时间:2014-12-16 15:40:32

标签: c++11 shared-ptr

我正在开发缓存,我需要知道对象何时过期。 可以在shared_ptr的引用计数器减少时运行函数吗?

std::shared_ptr< MyClass > p1 = std::make_shared( MyClass() );
std::shared_ptr< MyClass > p2 = p1; // p1.use_count() = 2
p2.reset(); // [ run function ] p1.use_count() = 1

3 个答案:

答案 0 :(得分:7)

每次引用计数减少时,您都不能调用一个函数,但是当它达到零时您可以调用一个函数。你通过传递一个&#34;自定义删除器&#34;到shared_ptr构造函数(你不能使用make_shared实用程序); deleter是一个可调用对象,负责传递和删除共享对象。

示例:

#include <iostream>
#include <memory>
using namespace std;

void deleteInt(int* i)
{
    std::cout << "Deleting " << *i << std::endl;
    delete i;
}

int main() {
    std::shared_ptr<int> ptr(new int(3), &deleteInt); // refcount now 1
    auto ptr2 = ptr; // refcount now 2
    ptr.reset(); // refcount now 1
    ptr2.reset(); // refcount now 0, deleter called
    return 0;
}

答案 1 :(得分:1)

您可以在创建shared_ptr时指定删除函数。以下文章显示了删除器的使用示例:

答案 2 :(得分:1)

不使用vanilla std::shared_ptr,但如果在调用reset()时需要自定义行为(没有参数),则可以轻松创建自定义适配器:

template <typename T>
struct my_ptr : public std::shared_ptr<T> {
    using std::shared_ptr<T>::shared_ptr;

    void reset() {
        std::shared_ptr<T>::reset(); // Release the managed object.

        /* Run custom function */
    }
};

并像这样使用它:

my_ptr<int> p = std::make_shared<int>(5);
std::cout << *p << std::endl; // Works as usual.
p.reset(); // Customized behaviour.

修改

这个答案是为了解决一个我认为其他答案没有解决的问题的解决方案,即:每次使用reset()减少引用计数时执行自定义行为。

如果问题只是在对象发布上进行调用,请按照@Sneftel@fjardon的答案中的建议使用自定义删节工具。