2

我是智能指针的新手。不过,我对它有一个基本的了解。我观察到的是,智能指针必须以与其创建相反的顺序被销毁,否则智能指针可能会出现异常。考虑以下情况:

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(通过智能指针)怎么办?

4

3 回答 3

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.
于 2013-07-31T09:43:39.563 回答
1

我不知道您的 custom sharedPtr,但对于标准std::shared_ptr它的工作方式(来自链接的参考):

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

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

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

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

于 2013-07-31T09:40:26.093 回答
1

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

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

于 2013-07-31T09:40:35.877 回答