动态分配的shared_ptr可以通过它管理的对象的dtor自行删除吗?

Mar*_*mes -19 c++ multithreading

在回答另一个问题时,我想到我可能优化了一些我自己的旧代码,这些代码错误地"生命周期管理不够理想".

我至少有一个app,其中一个对象的访问/生命周期由shared_ptr控制.这个ptr是动态分配的,因此它可以被"原子地"换出另一个*shared_ptr(并因此被新的ptr管理的更新对象),而不需要任何锁定.这似乎工作正常,但我故意泄漏旧的ptr,因为我不知道什么时候最后一个线程将完成它.

它现在发生在我身上,我可以(可能)删除()旧托管的旧对象中的旧*shared_ptr.我会在创建时将*sharedPtr加载到托管对象的私有数据成员中,以便dtor可以删除它.

有没有人这样做过,或者对它为什么不安全有任何看法?我可以尝试一下,但是我担心,就像许多多线程'优化'一样,它可能只是"看似有效",直到我交付它之后:(

Ton*_*ion 8

听起来你的代码中的设计问题比其他任何东西都要糟糕.首先,你为什么要创建一个shared_ptr*?这似乎已经错了.

然后泄漏它,因为你不知道什么时候其他线程将完成它?什么??那很糟.

为什么不只有两个shared_ptr并正确使用它们?也许这会让你的生活更轻松.

另外,不,你不能shared_ptr*用它拥有的对象的析构函数来删除它自己.这可能会进入一个牢不可破的循环.因为shared_ptr试图删除它拥有的对象,然后那将尝试删除所有者,反过来......你明白了......这很愚蠢.

  • 好的,我必须接受某人.在安妮的摇滚/纸/剪刀之后,你赢了! (2认同)