多线程环境中的智能指针



我是智能指针的新手。然而,我对此有一个基本的理解。我观察到,智能指针有必要按照创建的相反顺序被销毁,否则智能指针可能会行为不端。考虑以下情况:

sharedPtr<abc> my_ptr(new abc); //smart pointer created. Instance counter = 1.
func1(my_ptr);                  //copy constructor in smart pointer called. Instance    counter=2
func2(my_ptr);                  //copy constructor in smart pointer called. Instance counter=3
func3(my_ptr);                  //copy constructor in smart pointer called. Instance counter=4

现在,不是必须先退出func3(),然后退出func2()func1(),最后退出my_ptr吗。

问题:如果my_ptr首先超出范围(并因此尝试删除abc),而func1()func2()func3()仍然引用abc(通过智能指针),该怎么办?

实际上,您所观察到的是错误的。

智能指针的目的是消除破坏对象的责任。这意味着当引用计数达到0时,对象将被删除:先销毁哪个指针并不重要

在您的情况下,这将是当my_ptr超出范围时(假设您没有在func().中制作并保存副本

这就是参考计数器应该是什么:

{
sharedPtr<abc> my_ptr(new abc); //smart pointer created. Ref counter = 1.
func1(my_ptr);                  // Ref counter=2 while in func1
// Ref count is 1 again.
func2(my_ptr);                  // Ref counter=2 while in func2
// Ref count is 1 again.
func3(my_ptr);                  // Ref counter=2 while in func3
// Ref count is 1 again.
} // my_ptr goes out of scope, ref count reach 0, and abc is deleted.

我不知道您的自定义sharedPtr,但对于标准std::shared_ptr,它的工作方式如下(来自链接引用):

发生以下任一情况时,对象将被销毁,其内存将被释放:

  • 拥有该对象的最后一个剩余sharedptr被销毁。

  • 通过运算符=()或reset()为拥有该对象的最后一个剩余sharedptr分配另一个指针。

因此,对于std::shared_ptr,您可以将其传递或制作任意数量的副本,这些副本的销毁顺序无关紧要。

我观察到的是,智能指针有必要按照创建的相反顺序被销毁

好吧,共享智能指针存在的唯一原因是人们不应该关心它们何时被销毁。当最后一个共享指针被销毁时,它会销毁对象,就像"最后一个离开的人会关灯"一样。

相关内容

  • 没有找到相关文章

最新更新