【问题标题】:Detecting memory leaks检测内存泄漏
【发布时间】:2021-12-01 16:47:17
【问题描述】:

考虑以下代码:

int main(){
    A c;
    A array[5];
    A *ptr;
}

假设 A 类没有内存泄漏。以上代码有没有内存泄露?

我的想法

这六个A 类型对象的变量carray 将被分配/实例化。

ptr 变量未分配任何内容,因此不会在那里创建任何内容。

对于carray,在程序退出之前,将调用它们的析构函数。

所以,不应该有任何内存泄漏。

我不确定我上面的推理。

另外,array 的内存会被分配 - 在堆栈外、堆外还是在全局内存空间中?

【问题讨论】:

  • 我认为你是对的,第一个是堆栈分配的,会自动释放(假设 A 没有内存泄漏)。第二个基本相同,只是五次,第一个是一个本地指针,总是无泄漏
  • 关于你的第二个问题:只要A没有在堆上分配任何东西,一切都会被堆栈分配
  • 内存泄漏意味着存在要泄漏的具有动态存储持续时间的对象。您的示例不包含这样的对象。
  • 添加的问题不属于这个问题,但是:C++ 对堆栈或堆一无所知,但它可能最终会出现在堆栈上。
  • 你的推理是正确的,只是当你开始分配内存时的一个提示,你确实需要指向 A 的指针,然后看看 std::unique_ptr/std::make_unique。不像现在大多数书籍中仍然是首选方法。 (isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-owner)

标签: c++ memory-leaks


【解决方案1】:

没有内存泄漏,因为没有不匹配

  1. malloc / free
  2. new / delete
  3. new[] / delete[]

数组array[5] 具有自动存储持续时间。这是“在堆栈上”的正式术语。从概念上讲,它在main() 的右大括号} 处超出范围,在ptr 超出范围之后。

【讨论】:

  • 谢谢。那么内存是否仅使用new 运算符在堆上分配?另外,有没有办法以编程方式验证某物是否在堆或堆栈上?操作系统是否知道堆和栈的区别,还是只是逻辑上的分离或思维方式?
  • “只有使用 new 运算符才能在堆上分配内存” - auto a = new A, a 具有动态存储持续时间
  • “还有,有没有办法以编程方式验证某物是否在堆或堆栈上”,不,没有。
  • “操作系统是否知道堆和栈之间的区别” - 从堆和栈的角度考虑可能很方便,但请注意,这些术语不是 C++ 语言概念,而是与 C++ 的实现方式有关。
  • 所以这意味着这个栈和堆在 C++ 语言的实现中内部使用。那是对的吗?有没有很好的参考来阅读它?还有,C++ 是用汇编语言写的吗?
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2012-01-22
  • 2015-02-28
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多