2013-02-22 41 views
0

我主要使用高级编程语言 ,但 所以昨天一位朋友问我如何帮助他解决一个简单的C++练习,并且在编写它时我编写了这段代码:简单内存问题练习

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

我的问题在这里:这会导致内存泄漏作出,b,C总是在不同的存储位置来创建,或者将它们始终与每一个循环改写?如果你有动态(通过调用newnew []malloccalloc)分配的变量

+3

第 – 2013-02-22 15:12:28

+0

你问关于C还是C++?请选择一个并移除其他标签。 – 2013-02-22 15:13:10

+2

@Robᵩ - 答案与C和C++相同:否。 – 2013-02-22 15:14:50

回答

11

内存泄漏时才会发生。您的代码中没有任何内容,所以

什么是本地或自动变量。正如名称所示,当创建它们的作用域{}结束时,自动变量将被隐式释放。

3

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

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

+0

如果它们在内部动态分配资源并且不在释放它们的析构函数中,或者没有其他机制释放资源,它们可能会泄漏。 – juanchopanza 2013-02-22 15:15:44

+0

这是一个公平点,我已经相应更新 – 2013-02-22 15:20:58

+0

@juanchopanza:如果我们假设类的设计是正确的。然后在用作自动变量时它们不会泄漏。 – 2013-02-22 16:50:14

0

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

2

你问三个问题:

这将导致内存泄漏

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

A,B,C总是在记忆

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

他们将与每一个循环总是覆盖?

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

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

+0

术语堆/堆栈在描述C++时没有用处。你想要的术语是“自动存储”和“动态存储”。请参阅http://stackoverflow.com/q/6403055/14065 – 2013-02-22 16:53:55

+0

@Loki Astari感谢您提供的信息,我目前还没有意识到这一点。 – hetepeperfan 2013-02-22 19:12:27