【问题标题】:construct two shared_ptr objects from the same pointer从同一个指针构造两个 shared_ptr 对象
【发布时间】:2009-05-16 03:02:05
【问题描述】:

我有一个来自“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,请原谅我的英语不好。

【问题讨论】:

  • 您在 SX 构造函数中缺少“{”。 (只是为了迂腐)

标签: c++ shared-ptr tr1


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-14
        • 1970-01-01
        相关资源
        最近更新 更多