C++ 我需要删除静态std::map吗?

C++ 我需要删除静态std::map吗?,c++,stl,stdmap,C++,Stl,Stdmap,在某些类中,我有一个带有指针的静态std::map。我的问题是,我是需要在程序结束时删除,还是自动释放内存。我关心的是,当删除std::map时,是否通过析构函数正确删除了存储在其中的指针 谢谢。如果您有指针映射,那么答案是“否”,您的析构函数将不会被调用,但是“是”,内存将在进程执行结束时释放。当进程退出时(即使崩溃),操作系统始终会释放进程分配的所有内存,但可能不会调用析构函数。内存是“自动释放的”,即释放整个进程内存,但不会调用指向的对象的析构函数。如果使用RAII,这可能会导致资源泄漏。

在某些类中,我有一个带有指针的静态std::map。我的问题是,我是需要在程序结束时删除,还是自动释放内存。我关心的是,当删除std::map时,是否通过析构函数正确删除了存储在其中的指针


谢谢。

如果您有指针映射,那么答案是“否”,您的析构函数将不会被调用,但是“是”,内存将在进程执行结束时释放。当进程退出时(即使崩溃),操作系统始终会释放进程分配的所有内存,但可能不会调用析构函数。

内存是“自动释放的”,即释放整个进程内存,但不会调用指向的对象的析构函数。如果使用RAII,这可能会导致资源泄漏。

std::map
从不对其成员调用
delete
。假设您使用的是相对较新的操作系统,操作系统将在进程终止时回收成员占用的内存,但析构函数将不会运行。

如果映射包含分配了(或,或)的指针,则每个指针都需要相应的(或,或)

地图的析构函数不知道如何处理秃顶的指针。考虑使用一个具有适当移动语义的A,或者如果你有一个非常新的编译器的话。但是,不要在STL容器内使用当前标准

编辑:


正如Billy ONeal所指出的,也正是为了这个目的而设计的。

就像任何存储指针的存储类一样:您负责释放指针指向的内存。存储类只负责清理自己的资源。在进程终止时依赖操作系统回收内存是一种糟糕的做法

如果我正确理解了情况,您不会删除地图本身。但您可能需要删除地图所指向的对象。在地图中使用智能指针而不是本机指针可能是一个非常好的主意。然后这些物体会被自动清理

编辑: 使用可能是一个更好的主意。

内存“泄漏”是指在一段时间内无意中没有删除内存,并随着进程的继续而减少。如果这是一种运行时间很长的进程,例如很少重新启动的服务器,那么这可能是一个主要问题

内存泄漏检测器将检测任何已分配且未通过编程调用删除的内存,因此valgrind等将此报告为泄漏

也可以使用valgrind之类的程序检查代码,因此“阻碍”越少,就越容易发现真正的漏洞。因此,我的建议是,当您使用new(或malloc或new[])分配指针时,不要让系统为您清理内存或单例等


你可以有一个“清理”程序来做这件事。只需在映射范围内有一个对象,该对象具有一个删除器(当它退出时将被删除),该删除器将清除映射中的指针。由于您需要首先删除对象,因此应在映射之后声明该对象。

也不总是正确的(尽管对大多数平台是正确的),也不总是正确的,但对大多数平台都是正确的。您假设基础平台支持“进程”的概念,这并不总是正确的。+1——但是w.r.t.auto_ptr我会使用比“avoid”更强的语言,因为auto_ptr的容器不应该编译。(AutoTypTR在其他地方都很好)也考虑<代码> Boo::PTRYMAP。谢谢帮助。我想我需要提高1.45A,“存储类”可以做几乎任何事情。现在,标准容器不会删除任何内容,但是完全有可能有一个容器会对其自身的成员进行核攻击。例如,boost::ptr_映射/boost::ptr_vector@Billy同意。我使用了太宽泛的术语(“存储类”),但我想到了STL容器。@Bojan:
boost::ptr_vector
是一个STL容器,但当它被销毁时,它肯定会破坏它的内容。(哦,我没有投反对票)@Billy:我不确定我能不能将Boost容器视为STL的一部分。它们是基于STL构建的。当前C++标准不知道Boost,但知道STL(当然,这将用新的C++ 0x改变)。所有boost指针容器库都满足那里的要求。它们不是标准库中STL的正态分布,但这并不意味着它们不是STL容器。