在一些类中,我有一个带有指针的静态std::map。我的问题是,我是否需要在程序结束时删除它,还是这个内存会自动释放。我的担忧是,当std::map被删除时,里面存储的指针是否会通过我们的析构函数正确地被删除。
谢谢。
编辑:
正如Billy ONeal所指出的那样,boost::ptr_map也是专门为此目的设计的。
内存是“自动释放”的,意思是整个进程的内存被释放,但指向的对象的析构函数不会被调用。如果使用RAII,这可能会导致资源泄漏。
std::map
永远不会在其成员上调用 delete
。假设您正在使用相对较新的操作系统,操作系统将在进程终止时回收成员占用的内存,但析构函数不会运行。
内存泄漏是指在一段时间内意外未删除内存,随着进程的继续运行而逐渐减少。如果是长时间运行的进程类型,例如很少重启的服务器,这可能是一个严重的问题。
内存泄漏检测器将捕获任何由编程调用分配但未删除的内存,因此valgrind等工具将报告此类泄漏。
最好使用像valgrind这样的程序来检查您的代码,因此越少的“干扰”,就越容易发现真正的泄漏。因此,我的建议是不要让系统清理内存或单例等,而是自己使用new(或malloc或new[])分配指针。
您可以编写“清理”程序来完成此操作。只需在映射范围内拥有一个对象,该对象具有删除器(因为它将在退出时被删除),该删除器将清除映射中的指针。由于您需要首先删除对象,因此它应该比映射声明晚。
像任何存储指针的存储类一样:您有责任释放它们所指向的内存。存储类仅负责清理自己的资源。依赖进程终止时由操作系统回收内存是一种不良实践。
23.2.1
。所有boost指针容器库都满足那里列出的要求。它们不在标准库中普通的STL发行版中,但这并不意味着它们不是STL容器。 - Billy ONeal