简单的记忆问题练习

Simple memory issue exercise

本文关键字:练习 问题 记忆 简单      更新时间:2023-10-16

我主要从事高级编程语言的工作,所以昨天一个朋友让我帮他解决一个简单的C++练习,当我在做的时候,我写了一段代码:

for (int x = 0; x < 10; x++){
    int a, b, c;
    a = x;
    b = x*2;
    c = x+5;
}

我的问题是:这会导致内存泄漏,使a、b、c总是在内存的不同位置创建,还是总是被每个循环覆盖?

只有在动态分配变量的情况下(通过调用newnew []malloccalloc(,才会发生内存泄漏。您的代码中没有,所以没有

您所拥有的是本地或自动变量。正如名称所说,当创建自动变量的作用域{}结束时,自动变量会隐式解除分配。

abc将在堆栈上分配。除非类型本身通过其构造函数和/或析构函数导致内存泄漏,否则自动变量永远不会导致内存泄漏。

关于它们是否会覆盖每个循环的问题:我强烈怀疑地球上的每个编译器都会这样做,但原则上,这并不能保证。如果查看汇编输出,您会发现(a(所有变量都在寄存器中,或者(b(它们作为堆栈指针的固定偏移量检索。由于每次在循环中都执行相同的程序集,因此它们确实会被覆盖。

您会问三个问题:

这将导致内存泄漏

不,这里没有内存泄漏。正如该术语通常使用的那样,存储器泄漏需要没有deletenew、没有delete[]new[]或没有free()malloc()

a、b、c总是在内存的不同位置创建

它们可能是。它们可能不是。这是一个你的程序不需要知道的实现细节。您所需要知道的是,对象是在定义它们的行处创建的,并在该范围的右大括号处销毁。

每次循环都会覆盖它们

它们可能是。它们可能不是。这是您的程序不需要知道的实现细节。无论它们是否被覆盖,每次循环时都会被销毁。

在循环的每次迭代中,内存中的相同位置将用于存储abc中的值。

如果您创建一个类似的变量

int i = 5;

编译器会把它们放在堆栈上,你不必释放int。但是,如果在堆上创建int,

int* i = new int; /*C++ style*/
int* j= (int*) malloc(sizeof(int)); /*C style*/

你必须这样释放内存:

delete i; /*C++ style*/
free(j); /*C style*/

否则你会有内存泄漏。最重要的是,您不希望混合使用c和c++风格的内存处理。