我们是否需要删除对非新对象的引用?

时间:2012-12-06 07:10:45

标签: c++ reference

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

2 个答案:

答案 0 :(得分:2)

对象本身不会泄露,因为它没有动态分配。

以上内容可能导致内存泄漏,例如:

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

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

答案 1 :(得分:2)

不,您从未致电new,因此您无需致电delete

您应该仅为动态分配的对象调用delete。您的对象未动态分配,因此您不需要。如果这样做,将导致未定义的行为。

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


另外,请注意,被视为内存泄漏的内容可供解释。

在您的情况下,相关对象是全局的,并且保证在程序的整个生命周期中都存在。即使这个物体泄漏记忆,它也是不重要的。
此对象计划在程序结束前保持活动状态,即使泄漏内存,内存泄漏的持续时间也会导致此全局对象被破坏到程序中的最后一个语句,之后操作系统将回收泄漏的内存一旦你的程序结束。

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

您应该担心的泄漏类型是 重复泄漏 ,在程序生命周期内会反复泄漏内存的函数或结构。这最多只是一个 有限泄漏 场景,并不重要。