2014-02-19 50 views
1

我最近使用了新的C++ 11功能,如std :: shared_ptr,因为我将C代码转换为类,并且在此代码中存在大量“老式“指针。 我有一个疑问:在一个类的方法中,我使用本地shared_ptr,我可以初始化它们与传递到另一个smart_ptr引用的数据,然后修改数据? 例如:std :: shared_ptr使用其他shared_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中的数据,而不进行冗余操作?

问候

迈克

+3

通过做你正在做什么,你有*两个*单独的共享指针,具有单独的引用计数,但都指向同一个对象。这通常不是一个好主意。如果你只是做'std :: shared_ptr my_local_ptr = my_reference;'正确的事情会自动发生“。 –

回答

2

你在做什么是错的(这在技术上是有效的代码,但是你打算这可能不是你)。当像这样构造时,my_local_ptr将指向与my_reference相同的对象,但它将具有其自己的引用计数(初始化为1)。用标准术语说,它不会与my_reference“共享所有权”。

而且一旦my_local_ptr超出范围,它会高兴地调用删除器 - 销毁指向的对象,并使my_reference悬空。然后,当shared_ptrmy_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 */ 
} 
+0

是的,我刚刚也读过这个http://en.wikipedia.org/wiki/Smart_pointer 我不确定是否与纯分配共享所有权。 – madduci

相关问题