0

我主要使用高级编程语言,昨天一个朋友让我帮他解决一个简单的 C++ 练习,当我在做这个练习时,我写了这段代码:

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

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

4

5 回答 5

10

仅当您具有动态分配的变量(通过调用newornew []mallocorcalloc)时,才会发生内存泄漏。您的代码中没有,所以NO

您拥有的是本地或自动变量。顾名思义,自动变量{}在创建它们的范围结束时被隐式释放。

于 2013-02-22T15:13:14.087 回答
3

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

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

于 2013-02-22T15:13:59.873 回答
2

你问三个问题:

这将导致内存泄漏

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

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

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

它们总是会被每个循环覆盖?

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

于 2013-02-22T15:16:51.423 回答
0

内存中的相同位置将用于将值存储在a和循环的每次迭代中bc

于 2013-02-22T15:15:17.793 回答
0

如果您创建这样的变量

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++ 风格的内存处理。

于 2013-02-22T15:20:32.153 回答