从同一个指针构造两个shared_ptr对象

时间:2009-05-16 03:02:06

标签: c++ shared-ptr tr1

我在“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 个答案:

答案 0 :(得分:3)

您需要做的只是从第一个shared_ptr构建第二个shared_ptr

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

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

答案 1 :(得分:2)

你发现的伎俩是有效的,虽然没用。 shared_ptr的核心功能是引用计数,您在此处进行了颠覆。删除器(第二个构造函数参数)用于将shared_ptr与除普通指针之外的资源一起使用。您可以将它与文件一起使用,例如:


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

与数据库连接,套接字等等相同,一般为RAII

答案 2 :(得分:1)

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

答案 3 :(得分:0)