C++ 防止std::set删除内存

C++ 防止std::set删除内存,c++,memory-management,set,C++,Memory Management,Set,有没有办法防止使用std::set.erase(它)函数删除内存? 我只希望从集合中删除对象*,而不释放内存 具体来说,我有一个对象,它将自己从集合中移除,并将自己放到另一个集合中。 它崩溃了 set1.insert(this); set1.erase(set1.find(this)); set2.insert(this); 有人能复制这个吗?谢谢大家! 因为您在集合中存储原始指针,所以不需要做任何特殊的操作:调用erase时不会释放内存 至于可能导致崩溃的原因,请发布一些相关代码和崩

有没有办法防止使用
std::set.erase(它)
函数删除内存? 我只希望从集合中删除
对象*
,而不释放内存

具体来说,我有一个对象,它将自己从集合中移除,并将自己放到另一个集合中。 它崩溃了

set1.insert(this);    
set1.erase(set1.find(this));
set2.insert(this);

有人能复制这个吗?谢谢大家!

因为您在集合中存储原始指针,所以不需要做任何特殊的操作:调用
erase
时不会释放内存


至于可能导致崩溃的原因,请发布一些相关代码和崩溃具体位置的详细信息。

您的集合中有什么?QObject*? 如果是这样的话,
erase
应该只释放指针,而不是它所指向的实例。。。
你在看一棵树吗?这就是你的意思吗?

这已经发生了

元素-指针-被销毁。当你调用迭代器的擦除操作时,你的
集合
已经没有删除指向的对象了。如果它在那个区域坠毁,那是因为另一个原因。可能的原因有:

  • 删除项目后,您将使用迭代器
  • 析构函数丢失/不正确
  • 缺少/不正确的复制构造函数/复制赋值运算符
  • 与堆无关的问题,例如双重删除

您不能首先使用set吗?但是,这需要你自己处理生命周期管理。你的std::set是什么类型的
std::set
std::set
?@GWW它是一个std::set当调用
set1.erase(set1.find(this))
时,您是否100%确信,
这个
实际上存在于
set1
中?@aix是的。。我在课堂的其他部分使用它,然后我不知道发生了什么事XD谢谢anyway@Inuart:不用担心。祝你好运我想如果它只允许我在不担心析构函数的情况下触发指针就可以了。。另外,我现在的代码中不使用删除功能。也许你是对的,我只是太傻了,不能让它正常工作。。再次感谢你们所有人!现在修好了。您的第一个猜测是正确的:迭代器XD谢谢!