在某些类中,我有一个带有指针的静态std :: map。我的问题是,如果我需要在程序结束时删除或自动释放此内存。我关心的是当删除std :: map时,是否通过析构函数正确删除了存储在内部的指针。
感谢。
答案 0 :(得分:6)
如果地图包含使用new(或new[]或malloc)分配的指针,则每个指针都需要相应的delete(或delete[] },或free)。
地图的析构函数不知道如何处理光头指针。考虑使用具有适当移动语义的smart pointer,如boost smart pointer,或者如果你有一个非常新的编译器,C++0x smart pointers之一。但是,不要在STL容器内使用当前标准的std::auto_ptr。 See this thread for why
编辑:
正如Billy ONeal所指出的,boost::ptr_map也是为此目的而设计的。
答案 1 :(得分:2)
如果我正确了解情况,则不会删除地图本身。但您可能需要删除地图指向的对象。在地图中使用诸如Boost shared_ptr之类的智能指针而不是本机指针可能是一个非常好的主意。然后自动清理对象。
编辑: 使用Boost ptr_map可能是一个更好的主意。
答案 2 :(得分:1)
在释放整个进程内存的意义上,“自动释放”内存,但不会调用指向的对象的析构函数。如果您使用RAII,这可能会导致资源泄漏。
答案 3 :(得分:1)
std::map
从不在其成员上调用delete
。假设您正在使用相对较新的操作系统,操作系统将回收进程终止时成员占用的内存,但析构函数将无法运行。
答案 4 :(得分:0)
如果你有一个指针映射,那么答案是'no',你的析构函数不会被调用,但是'yes',内存将在进程执行结束时被释放。当进程退出时(即使它崩溃),进程分配的所有内存总是由操作系统释放,但可能不会调用析构函数。
答案 5 :(得分:0)
内存“泄漏”是指在一段时间内无意中未删除内存,并随着进程的继续而减少内存。如果它是一种运行很长一段时间的进程,例如很少重启的服务器,这可能是一个主要问题。
内存泄漏检测器将接收已分配但未被编程调用删除的任何内存,因此valgrind等会将此报告为泄漏。
使用像valgrind这样的程序来检查你的代码也是如此,因此“越过障碍”越少,就越容易发现真正的漏洞。因此,当您使用new(或malloc或new [])分配指针时,我的建议不是让系统为您清理内存或单例等。
您可以执行“清理”程序。只需在地图范围内有一个具有删除器的对象(因为它将在退出时删除),它将清除地图中的指针。由于您需要首先删除对象,因此应在地图之后声明它。
答案 6 :(得分:-1)
就像任何存储指针的存储类一样:你负责释放他们指向的内存。存储类仅负责清理自己的资源。在过程终止时依靠OS回收内存是一种不好的做法。