我是智能指针的新手。然而,我对此有一个基本的理解。我观察到,智能指针有必要按照创建的相反顺序被销毁,否则智能指针可能会行为不端。考虑以下情况:
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
,您可以将其传递或制作任意数量的副本,这些副本的销毁顺序无关紧要。
我观察到的是,智能指针有必要按照创建的相反顺序被销毁
好吧,共享智能指针存在的唯一原因是人们不应该关心它们何时被销毁。当最后一个共享指针被销毁时,它会销毁对象,就像"最后一个离开的人会关灯"一样。