我有 std::set
指向某种类型对象的共享指针(这里的 int
只是为了举例)。我需要的是插入由原始指针构造的共享指针。但是当我试图删除一些 set 元素时(同样我只有一个原始指针),我应该构造 shared_ptr
并将它传递给 erase 方法(在我看来这是真的因为 shared_ptr
的比较运算符在 ) 中比较它们的原始指针。
代码片段,导致 SIGABRT:
std::set<std::shared_ptr<int>> sett;
int *rp = new int(5);
sett.emplace( rp );
sett.erase( std::shared_ptr<int>( rp ) );
最佳答案
这不行:
sett.erase( shared_ptr<int>( rp ) );
这里,rp
是一个指针,所以你构造一个匿名临时shared_ptr
,然后你删除它指向的值和内存,然后你的匿名临时再次删除它.
您不得构造两个指向同一对象的不同 shared_ptr
。如果您需要类似的东西,您可以考虑使用 enable_shared_from_this
。或者更好的是,通过为 std::set
实现允许与原始指针进行比较的比较函数,从容器中删除而根本不构造 shared_ptr
。有关更多信息,请参阅:What are transparent comparators?
关于c++ - std::set of shared_ptr 的删除导致 SIGABRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48684653/