多线程环境中的智能指针

时间:2013-07-31 09:35:50

标签: c++ multithreading smart-pointers reference-counting

我是智能指针的新手。但是,我对它有基本的了解。我所观察到的是,智能指针必须以与其创建相反的顺序被破坏,否则智能指针可能会出错。考虑以下情况:

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首先超出范围(&amp;因此尝试删除abc),func1()func2(),该怎么办?并且func3()仍然引用abc(通过智能指针)?

3 个答案:

答案 0 :(得分:4)

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

智能指针的目的是消除破坏对象的责任。这意味着当引用计数达到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.

答案 1 :(得分:1)

我不了解您的自定义sharedPtr,但对于标准std::shared_ptr,它的作用类似于(来自链接参考):

  

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

     
      
  • 拥有该对象的最后剩余的shared_ptr被销毁。

  •   
  • 拥有该对象的最后一个shared_ptr通过operator =()或reset()分配另一个指针。

  •   

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

答案 2 :(得分:1)

  

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

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