3

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

谢谢。

4

7 回答 7

6

如果映射包含使用new(或new[]malloc)分配的指针,则每个指针都需要相应的delete(或delete[]free)。

地图的析构函数不知道如何处理一个秃头指针。考虑使用具有适当移动语义的智能指针,例如boost 智能指针,或者如果您有一个非常新的编译器,C++0x 智能指针之一。但是,不要在 STL 容器内 使用当前标准的std::auto_ptr 。请参阅此线程了解原因

编辑:

正如 Billy ONeal 所指出的,boost::ptr_map也正是为此目的而设计的。

于 2011-01-18T16:02:06.923 回答
2

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

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

于 2011-01-18T16:03:08.220 回答
1

内存是“自动释放的”,从某种意义上说,整个进程的内存都被释放了,但指向的对象的析构函数不会被调用。如果您使用 RAII,这可能会导致资源泄漏。

于 2011-01-18T16:01:47.637 回答
1

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

于 2011-01-18T16:02:03.173 回答
0

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

于 2011-01-18T16:01:39.800 回答
0

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

内存泄漏检测器将拾取任何已分配但未被编程调用删除的内存,因此 valgrind 等将报告为泄漏。

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

您可以有一个“清理”例程来执行此操作。只需在地图范围内有一个对象,该对象有一个删除器(因为它会在退出时被删除),它将清理地图中的指针。由于您需要先删除对象,因此应在地图之后声明它。

于 2011-01-18T16:06:50.830 回答
-1

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

于 2011-01-18T16:02:31.593 回答