如何从unordered_set中移除元素且不触发元素内存释放
核心结论
std::unordered_set调用erase方法时,仅会销毁容器自身存储的元素,不会额外处理指针指向的内存:
- 若容器存储普通
MyObject类型实例,erase会调用对应实例的析构函数 - 若容器存储
MyObject*类型的原生指针,erase只会销毁这个指针变量本身(指针本质是个存储内存地址的数值,销毁它没有任何额外资源释放逻辑,完全不会触及指针指向的MyObject实例)
你之前观测到的"erase释放了指针指向的对象"属于内存检测工具的错误识别,C++标准库的所有容器都不会在存储原生指针时自动释放指针指向的堆内存,这是语言的基础设计规则。
正确操作示例
#include <unordered_set> class MyObject { // 自定义类实现 }; int main() { std::unordered_set<MyObject*> obj_set; MyObject* test_obj = new MyObject(); obj_set.insert(test_obj); // 从容器中移除指针 obj_set.erase(test_obj); // 此时test_obj指向的实例仍然完全可用,没有被释放 // 后续你可以自行选择合适的时机手动delete释放资源 delete test_obj; return 0; }
额外说明:只有当容器元素为
std::unique_ptr<MyObject>、std::shared_ptr<MyObject>这类智能指针时,erase销毁智能指针实例才会触发其析构逻辑,自动释放指向的内存。你要求不使用智能指针的场景下,不需要担心erase会自动释放原生指针指向的资源。
内容的提问来源于stack exchange,提问作者marcelwgn
相关产品推荐
相关产品推荐

