我在“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,请原谅我糟糕的英语。
答案 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)
我从boost doc获得了“STANDARD”答案: http://www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp