我主要使用高级编程语言,但是所以昨天有朋友让我帮他解决一个简单的C ++练习,当我正在研究它时,我写了这段代码:
for (int x = 0; x < 10; x++){
int a, b, c;
a = x;
b = x*2;
c = x+5;
}
我的问题是:这是否会导致内存泄漏,使a,b,c始终在内存的不同位置创建,或者它们是否总是被每个循环覆盖?
答案 0 :(得分:10)
只有在您动态分配变量时才会发生内存泄漏(通过调用new
或new []
或malloc
或calloc
来)。您的代码中没有否。
您拥有的是本地或自动变量。正如名称所示,当创建它们的范围{}
结束时,隐式释放自动变量。
答案 1 :(得分:3)
a
,b
和c
将在堆栈上分配。自动变量永远不会导致内存泄漏,除非类型本身导致它们的构造函数和/或析构函数泄漏。
关于它们是否会覆盖每个循环的问题:我强烈怀疑地球上的每一个编译器都会这样做,但原则上这不能保证。如果查看汇编输出,您将发现(a)所有变量都在寄存器中或(b)它们从堆栈指针中检索为固定偏移量。由于每次循环执行相同的程序集,它们实际上都会被覆盖。
答案 2 :(得分:2)
你问三个问题:
这会导致内存泄漏
不,这里没有内存泄漏。如通常使用的那样,内存泄漏需要new
没有delete
,new[]
没有delete[]
,malloc()
没有free()
{1}}。
a,b,c始终在内存的不同位置创建
他们可能会。他们可能不是。这是您无需了解程序的实现细节。您需要知道的是,对象是在定义它们的行上创建的,并在该范围的右括号中被销毁。
它们将始终被每个循环覆盖?
他们可能会。他们可能不是。这是您的程序无需了解的实现细节。无论它们是否被覆盖,每次循环都会被破坏。
答案 3 :(得分:0)
内存中的相同位置将用于在循环的每次迭代中将值存储在a
,b
和c
中。
答案 4 :(得分: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 ++风格的内存处理。