是否可以在不调用包含对象的析构函数的情况下清空映射的内容?
Is it possible to empty a map's contents without the containing objects' destructors being called?
我有一个map
,用来快速访问程序中的一些元素。我想从map
中删除其中的一些元素(我在其他地方引用了它们)。有没有办法删除这些项,而不让map
的clear()
或erase()
函数调用它们的析构函数?
如果将指针映射到对象,则对象本身不会被破坏。如果对象本身在地图中,它们将被销毁。
使用shared_ptr,这就是它的用途。如果项目"明确"存储在其他地方,请考虑在地图中使用weak_ptr,并使用shared_ptr作为最终存储位置。
可能还有其他方法可以工作,但不用头疼,并使用正确的工具来完成任务。
否。
如果元素是按值存储的,就没有办法这样做。如果你需要这种功能,可以考虑将它们放入智能指针中(比如unique_ptr
,它允许你将持有的指针.release()
)。
否;具有CCD_ 8方法的唯一标准容器是CCD_。这意味着您可以将列表节点从一个列表移动到另一个列表,但不能映射或设置节点。
到目前为止,我们听到的是,您有一个容器,其中的值是指针。我假设键是琐碎的类型,比如整数,或者std::字符串。当您调用map<>时,您会说您的程序"崩溃":clear()。这表明在clear()调用之前存在某种内存损坏,因为我看不出清除简单值类型会崩溃的原因。
尝试在valgrind下运行程序以检测内存访问错误。你可能有一个。
相关文章:
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,工会成员会调用自己的析构函数吗
- C++ 在不释放内存的情况下调用析构函数
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 在scoped_ptr发生异常的情况下未调用析构函数
- 在这种情况下,我的派生类是否还需要一个虚拟析构函数
- 为什么std::vector::template在没有调用任何复制构造函数的情况下调用析构函数
- 为什么标准允许我在没有析构函数的情况下自由存储分配类
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 在不使用虚拟析构函数的情况下删除继承的对象时中止
- 在非虚拟析构函数的情况下自动调用父析构函数
- 是否可以使用 std::shared_ptr 创建共享对象池,并在没有自定义析构函数的情况下创建weak_ptr
- 如何在不调用现有对象的析构函数的情况下在向量中添加和初始化对象
- 在这种情况下,我是否需要调用矢量的析构函数
- 如何在不中断移动和复制构造函数的情况下声明虚拟析构函数
- 是否可以在不知道类型的情况下调用析构函数
- 如果在没有限定的情况下从构造函数/析构函数调用虚拟函数,则是否会发生虚拟调度
- 是否可以在不调用包含对象的析构函数的情况下清空映射的内容?
- 在不调用析构函数的情况下结束STL容器的生存期
- 在虚拟析构函数的情况下,虚拟机制是如何工作的