std :: shared_ptr用其他shared_ptr数据初始化

时间:2014-02-19 09:22:40

标签: c++11 shared-ptr

我最近使用了新的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中的数据,而不进行这种冗余操作?

此致

麦克

1 个答案:

答案 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 */
}