2014-09-02 145 views
-4

我是新来的C++编程,并不太能理解下面的代码差异:内存分配,C++

int n; 
cin >> n; 
int list[n]; 

int n; 
cin >> n; 
int *list = new int[n]; 

以及如何C++编译器的交易用这种代码?

编辑:请不要关于指针。我想知道如何在代码的第一个块中为“list”变量分配内存,因为“n”值是在运行时确定的。

可能重复:Why aren't variable-length arrays part of the C++ standard?

+3

这肯定是重复的,无论如何,第一个版本在堆栈上分配矢量头和类数据,第二个在堆上做所有的事情(除了指针) – 2014-09-02 11:06:00

+0

这个东西应该在前几章任何体面的C++书籍 - 你确实有一本体面的C++书籍,我希望? – 2014-09-02 11:06:34

+1

我编辑了你的问题的标题,使它更适合于实际的问题。然而,我并没有把它写成“措辞完美”,因为我不想使用“指针”这样的词,这部分是答案。请检查新标题,并重新编辑它,看起来合适! – quetzalcoatl 2014-09-02 11:08:53

回答

3

第一创建本地自动变量。这是(通常)存储在函数的堆栈帧,当函数执行开始时分配的一块临时内存(来自线程的堆栈),并在函数返回时释放。该对象在超出范围时将被销毁;也就是程序离开当前代码块时。这通常是您想要创建变量的方式,除非您需要它们的寿命长于此。

vector对象本身在堆栈上的大小是固定的。它管理如下所述从堆中分配的动态数组对象。它会自动销毁该阵列,释放它的内存,当它被销毁时。

第二创建一个动态对象,从该程序的自由存储(也被称为堆)。这将不会被破坏的,除非明确这样做:

delete list; 

这是一个非常糟糕的主意直接指向这样的动态对象来处理;很容易泄漏对象(可能是从函数返回,或抛出异常,并丢失指向它的唯一指针),或者意外复制指针并尝试删除它两次。

希望您的教程书将教您如何使用smart pointers以及RAII的一般原则安全地管理动态资源。如果没有,扔掉它并得到一个better one

+2

+1“扔掉”..这么多糟糕的学习资源:| – quetzalcoatl 2014-09-02 11:10:15

+0

感谢您的信息,但我知道这一事实。我想知道内存是如何分配给第一个代码块中的“list”的? – prototype 2014-09-02 11:17:22

+0

@prototype:我已经添加了一些关于堆栈(第一种情况下的矢量对象)和堆(两种情况下的矢量数组,以及第二种中的矢量对象)的内存分配的细节。 – 2014-09-02 11:20:01