我最近使用了新的C ++ 11功能,例如std :: shared_ptr,因为我正在将C代码转换为Classes,并且在这段代码中有大量使用“老式”指针。 我有一个疑问:在类的方法中,我使用本地shared_ptr,我可以用传递给另一个smart_ptr的引用数据初始化它们然后修改数据吗? 例如:
void myFunction(std::shared_ptr<T> &my_reference)
{
std::shared_ptr<T> my_local_ptr(my_reference.get());
/* Doing stuff on local pointer,
which modifies the object kept by my_reference pointer */
}
我做错了吗?或者你认为最好直接修改my_reference中的数据,而不进行这种冗余操作?
此致
麦克
答案 0 :(得分:2)
你所做的是错的(它是技术上有效的代码,但可能不是你想要的)。当这样构造时,my_local_ptr
将指向与my_reference
相同的对象,但它将具有自己的引用计数(初始化为1)。在标准条款中,它不会与my_reference
“共享所有权”。
一旦my_local_ptr
超出范围,它就会愉快地调用删除器 - 销毁指向的对象,并使my_reference
悬空。然后,当与shared_ptr
的最后一个my_reference
共享所有权被销毁时,它将调用其删除器,从而导致双重删除(除非悬挂在此之前导致崩溃)。
如果您需要传入shared_ptr
的本地副本(无论如何?),请务必复制整个shared_ptr
(包括所有权):
void myFunction(std::shared_ptr<T> &my_reference)
{
std::shared_ptr<T> my_local_ptr(my_reference);
/* Doing stuff on local pointer,
which modifies the object kept by my_reference pointer */
}