我是智能指针的新手。但是,我对它有基本的了解。我所观察到的是,智能指针必须以与其创建相反的顺序被破坏,否则智能指针可能会出错。考虑以下情况:
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
(通过智能指针)?
答案 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)
我观察到的是,智能指针必须按照创建的相反顺序销毁
嗯,存在共享智能指针的唯一原因是人们在被摧毁时不应该关心。当最后一个共享指针被销毁时,它会销毁该对象,就像“最后一个离开的人关灯一样。”