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