2012-02-13 52 views
-4

是什么区别:C++约动态存储器

int myArray[5]; 

int* myArray = new int[5]; 
+0

http://jcatki.no-ip.org/fncpp/Resources – 2012-02-13 21:52:29

+5

[阅读一本基本的C++书](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and -list) – 2012-02-13 21:59:39

回答

2

第一个是一个阵列的存储器块被分配静态地或作为过程中的堆栈上的自动可变一个函数的执行......它实际上取决于其声明/定义的上下文。

第二个将不编译:-)

认真地说,你真的想:

int* myArray = new int[5]; 

,这意味着我们已经声明指向数组中的指针型变量整数和整数的数组是动态由C++运行时通过调用new,这是存储器的段由OS分配给您的过程来动态分配变量在堆上分配。

0

的区别是什么

一个是有效的。

其他不是。

2

不同之处在于一生。

int myArray[5];

这保留存储为int阵列5。如果在块范围声明myArray,则该数组在声明块的末尾被丢弃。

int* myArray = new int[5]; 

这动态地分配的阵列5的int,存在该阵列,直到它与delete []释放。

6

int myArray[5]是一串具有自动(或静态)存储持续时间(本地存储器,通常分类为“在栈”)五个整数。当特定范围退出时,本地内存在C++中被清除。

int* myArray = new int[5]是五个整数与动态存储持续时间(动态存储器,通常分类为“在堆”)一堆。退出特定范围时,动态内存不会被清除(myArray必须是一个int指针,用于存储动态创建的内存的位置)。

查看下面的例子:

void foo(){ 
    int myArray[5]; 
} 

void bar(){ 
    int* myArray_dynamic = new int[5]; 
} 

int main(){ 
    foo(); 
    bar(); 
} 

foo将使用堆栈内存,所以当foo回报/退出内存将得到自动释放。但是,动态分配的内存的位置存储在myArray_dynamicbar中不会被释放,因为编译器只会释放myArray_dynamic的内存,而不是存储在其值的内存。

这将创建一个内存泄漏,所以每次使用的newnew[]必须有中deletedelete[]呼叫(除非你用智能指针工作,但那是另一个问题)。

bar正确版本是

void bar(){ 
    int* myArray_dynamic = new int[5]; 
    delete[] myArray_dynamic; 
} 

的主要原因挑选的一个或另一个是动态分配是比较慢,但是可以是任意大小(自动数组必须有一个固定的编译时大小) ,并且堆叠上的空间也是有限的,如果你用完,very bad things happen

+1

可能不在“堆栈”上。改为说“自动或静态存储时间”;同样,堆是一个实现细节:改为“免费存储”或“动态存储持续时间”。 – 2012-02-13 21:58:30

+3

我认识的大多数人都会说“在堆栈上”来指代自动存储时间。正如您所指出的,实际上是否在实际堆栈上是一个实现细节;我们不关心是否有实际的堆栈。除非你正在讨论底层实现真正重要的上下文,否则说“在堆栈上”对于你实际的意思来说是一个快速和理解的速记。虽然它可能并不总是技术上最正确的措辞选择,但它通常是*最佳*选择。 – Darryl 2012-02-13 22:26:39

+0

@Darryl:但我们不知道对象_has_自动存储的持续时间。陷阱陷入了困境。 – 2012-02-13 23:00:19

0

在第二,你必须写

int* myArray = new int[5]; 

new retuns指向堆动态分配的区域。

+0

它可能不是一堆。说“免费店”。 – 2012-02-13 21:57:50