gpt4 book ai didi

c++ - 我们需要删除对非新对象的引用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:27 25 4
gpt4 key购买 nike

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

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

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

1 个 block 中的 5 个字节仍然可以访问
...
键控到 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

最佳答案

不,您从未调用过new,因此您不必调用delete

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

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


另外,请注意,内存泄漏的定义是开放的,有待解释。

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

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

您应该担心的泄漏类型是反复发生的泄漏,在程序的生命周期内会反复泄漏内存的函数或结构。这充其量只是一个有限泄漏的场景,这无关紧要。

关于c++ - 我们需要删除对非新对象的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com