4

我有一个来自“C++ 标准库扩展”的问题:

练习 6
我在 2.4.2 节中说过,你不应该从同一个指针构造两个 shared_ptr 对象。危险在于 shared_ptr 对象或其后代最终都会尝试删除资源,这通常会导致麻烦。事实上,如果你小心的话,你可以做到这一点。它不是特别有用,但是编写一个程序,从同一个指针构造两个 shared_ptr 对象,并且只删除一次资源。

以下是我的回答:

template <typename T>
void nonsence(T*){}
struct SX {
     int data;
     SX(int i = 0) :
              data(i) {
              cout << "SX" << endl;
     }
     ~SX() {
              cout << "~SX" << endl;
     }
};
int main(int argc, char **argv) {
    SX* psx=new SX;
    shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
    cout<<sp1.use_count()<<endl;
    return 0;
}

但我认为这不是一个好的解决方案——因为我不想通过使用构造函数来解决它。谁能给我一个更好的?thx,请原谅我糟糕的英语。

4

4 回答 4

3

您需要做的就是shared_ptr从第一个构造第二个shared_ptr

shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );

只有当所有指向它的共享指针都被销毁时,创建的 SX 才会被正确删除。

于 2009-05-17T20:58:58.190 回答
2

您发现的技巧是有效的,尽管没用。的核心功能shared_ptr是引用计数,您在这里颠覆了它。删除器(第二个构造函数参数)用于shared_ptr与普通指针以外的资源一起使用。您可以将其与文件一起使用,例如:


typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );

与数据库连接、套接字等以及一般的RAII相同。

于 2009-05-16T03:54:29.710 回答
1

您可以查看 boost 如何使用shared_from_this解决它。这是代码

于 2009-05-16T03:09:00.863 回答
0

我从 boost doc 得到了“标准”的答案:http: //www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp

于 2009-05-22T06:56:21.727 回答