c++ - std::set of shared_ptr 的删除导致 SIGABRT

标签 c++ c++11 pointers shared-ptr stdset

我有 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/

相关文章:

c++ - 模板化隐式类型转换运算符

c++ - 在现代 C++ 中实现专门的数据结构

c++ - 在 C++11 中使用不带托管共享指针的 shared_from_this()

c++ - 将指针作为私有(private)数据成员传递给 Main 中的成员函数

c++ - 如何在 CLion 中同时运行多个调试器?

c++ - 为什么 C++ 默认初始化不对非类类型成员进行零初始化

c++ - C++ 中的 'side-effect' 到底是什么?

c++ - 返回对象的两种形式有什么区别?

c++11 - std::numeric_limits::quiet_NaN() 与 std::nan() 与 NAN

c++ - 数组和指针