2
classA objA (0, NULL);
classA & objB (objA);

假设以上是全局的,它会导致内存泄漏吗?原因?

实际上通过 Valgrind,我得到了一个错误:

5 bytes in 1 blocks are still reachable
...
global constructors keyed to classA

这说明什么?

更新:

确切的错误在这里。

at 0x4C2659D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6653==    by 0x4EA7BB7: newterminal (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4EA7D4E: Rf_InitConnections (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4F420DD: setup_Rmainloop (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4FEC76A: Rf_initEmbeddedR (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x5C3A8DB: RInside::initialize(int, char const* const*, bool) (in /usr/lib64/R/library/RInside/lib/libRInside.so)
==6653==    by 0x5C3AF60: RInside::RInside(int, char const* const*, bool) (in /usr/lib64/R/library/RInside/lib/libRInside.so)
==6653==    by 0x40D105: global constructors keyed to R
4

2 回答 2

2

对象本身没有泄漏,因为它不是动态分配的。

上述情况可能会导致内存泄漏,例如:

class classA
{
   classA() { new int[42]; }
};

这可以通过提供析构函数或使用 RAII 来解决。

于 2012-12-06T07:11:43.557 回答
2

不,你从来没有打电话new,所以你不必打电话delete

您应该delete只调用动态分配的对象。你的对象不是动态分配的,所以你不需要。如果这样做,将导致未定义的行为。

当然,假设您没有class A构造函数会泄漏内存或导致未定义的行为,这是显而易见且相当自然的。


另外,请注意,所谓的内存泄漏是可以解释的。

在您的情况下,所讨论的对象是全局的,并且保证在您的程序的整个生命周期中都存在。即使这个对象泄漏内存,它也根本不重要。
这个对象被安排在你的程序结束之前一直存在,即使它泄漏了内存,内存泄漏的持续时间是这个全局对象的销毁到程序中的最后一条语句,之后泄漏的内存将被操作系统回收一旦你的程序结束。

所以,实际上这个对象是否泄漏并不重要,当然 valgrind 会将它报告为泄漏,但是当它对你的程序无关紧要时它就会泄漏。

您应该担心的泄漏类型是重复性泄漏、函数或构造,它们会在程序的生命周期内反复泄漏内存。这充其量只是有限的泄漏情况,这并不重要。

于 2012-12-06T07:12:02.067 回答