简单的记忆问题练习

时间:2013-02-22 15:11:36

标签: c++ memory-management memory-leaks

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

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

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

5 个答案:

答案 0 :(得分:10)

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

您拥有的是本地或自动变量。正如名称所示,当创建它们的范围{}结束时,隐式释放自动变量。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

你问三个问题:

  
    

这会导致内存泄漏

  

不,这里没有内存泄漏。如通常使用的那样,内存泄漏需要new没有deletenew[]没有delete[]malloc()没有free() {1}}。

  
    

a,b,c始终在内存的不同位置创建

  

他们可能会。他们可能不是。这是您无需了解程序的实现细节。您需要知道的是,对象是在定义它们的行上创建的,并在该范围的右括号中被销毁。

  
    

它们将始终被每个循环覆盖?

  

他们可能会。他们可能不是。这是您的程序无需了解的实现细节。无论它们是否被覆盖,每次循环都会被破坏。

答案 3 :(得分:0)

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

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