是否可以在不调用包含对象的析构函数的情况下清空映射的内容?

Is it possible to empty a map's contents without the containing objects' destructors being called?

本文关键字:情况下 析构函数 清空 映射 对象 包含 调用 是否      更新时间:2023-10-16

我有一个map,用来快速访问程序中的一些元素。我想从map中删除其中的一些元素(我在其他地方引用了它们)。有没有办法删除这些项,而不让mapclear()erase()函数调用它们的析构函数?

如果将指针映射到对象,则对象本身不会被破坏。如果对象本身在地图中,它们将被销毁。

使用shared_ptr,这就是它的用途。如果项目"明确"存储在其他地方,请考虑在地图中使用weak_ptr,并使用shared_ptr作为最终存储位置。

可能还有其他方法可以工作,但不用头疼,并使用正确的工具来完成任务。

否。

如果元素是按值存储的,就没有办法这样做。如果你需要这种功能,可以考虑将它们放入智能指针中(比如unique_ptr,它允许你将持有的指针.release())。

否;具有CCD_ 8方法的唯一标准容器是CCD_。这意味着您可以将列表节点从一个列表移动到另一个列表,但不能映射或设置节点。

到目前为止,我们听到的是,您有一个容器,其中的值是指针。我假设键是琐碎的类型,比如整数,或者std::字符串。当您调用map<>时,您会说您的程序"崩溃":clear()。这表明在clear()调用之前存在某种内存损坏,因为我看不出清除简单值类型会崩溃的原因。

尝试在valgrind下运行程序以检测内存访问错误。你可能有一个。

相关文章: