我已经从 “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,原谅我的英语不好。

有帮助吗?

其他提示

所有需要做的是从第一shared_ptr构造第二shared_ptr

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

,只有当所有共享指针到它被破坏所创建的SX然后将适当地删除。

您发现的诀窍是有效的,但没用。 shared_ptr的核心特征是引用计数,你在这里颠覆。所述删除器(第二构造器参数)是有使用shared_ptr与其他资源然后平原指针。你可以使用文件使用它,e.g:


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

同样的,数据库连接,插座等等,并且 RAII 一般。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top