回答
第一个是一个阵列的存储器块被分配静态地或作为过程中的堆栈上的自动可变一个函数的执行......它实际上取决于其声明/定义的上下文。
第二个将不编译:-)
认真地说,你真的想:
int* myArray = new int[5];
,这意味着我们已经声明指向数组中的指针型变量整数和整数的数组是动态由C++运行时通过调用new
,这是存储器的段由OS分配给您的过程来动态分配变量在堆上分配。
的区别是什么
一个是有效的。
其他不是。
不同之处在于一生。
int myArray[5];
这保留存储为int
阵列5。如果在块范围声明myArray
,则该数组在声明块的末尾被丢弃。
int* myArray = new int[5];
这动态地分配的阵列5的int
,存在该阵列,直到它与delete []
释放。
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_dynamic
的bar
中不会被释放,因为编译器只会释放myArray_dynamic
的内存,而不是存储在其值的内存。
这将创建一个内存泄漏,所以每次使用的new
或new[]
必须有中delete
或delete[]
呼叫(除非你用智能指针工作,但那是另一个问题)。
的bar
正确版本是
void bar(){
int* myArray_dynamic = new int[5];
delete[] myArray_dynamic;
}
的主要原因挑选的一个或另一个是动态分配是比较慢,但是可以是任意大小(自动数组必须有一个固定的编译时大小) ,并且堆叠上的空间也是有限的,如果你用完,very bad things happen。
可能不在“堆栈”上。改为说“自动或静态存储时间”;同样,堆是一个实现细节:改为“免费存储”或“动态存储持续时间”。 – 2012-02-13 21:58:30
我认识的大多数人都会说“在堆栈上”来指代自动存储时间。正如您所指出的,实际上是否在实际堆栈上是一个实现细节;我们不关心是否有实际的堆栈。除非你正在讨论底层实现真正重要的上下文,否则说“在堆栈上”对于你实际的意思来说是一个快速和理解的速记。虽然它可能并不总是技术上最正确的措辞选择,但它通常是*最佳*选择。 – Darryl 2012-02-13 22:26:39
@Darryl:但我们不知道对象_has_自动存储的持续时间。陷阱陷入了困境。 – 2012-02-13 23:00:19
在第二,你必须写
int* myArray = new int[5];
new
retuns指向堆动态分配的区域。
它可能不是一堆。说“免费店”。 – 2012-02-13 21:57:50
- 1. C#静态存储器地址
- 2. 如何编码和存储动态权限约束?
- 3. [C]的结构的动态分配存储器,与GTK
- 4. C:动态存储字符串(动态大小!)?
- 5. C++:静态指针,静态对象和动态存储器分配
- 6. C++浮动存储
- 7. C#存储泛型状态
- 8. 存储动态JPA查询
- 9. 动态表存储名称
- 10. 存储动态QML对象
- 11. c - 动态内存
- 12. C动态内存
- 13. 静态存储器管理
- 14. 用于国际象棋移动代的C++动态存储
- 15. Java接口...动态或静态存储器?
- 16. C寄存器调用约定
- 17. 动态存储器存取只能内部功能
- 18. 存储器限制在C++
- 19. 如何动态在2D阵列和存储值分配存储器?
- 20. C++从存储器加载位图 - 存储器泄漏
- 21. 内容类型 - 动态数据结构存储C#+ SQL服务器
- 22. 插入对象与动态存储器阵列(无载体允许)C++
- 23. C++中的动态内存
- 24. 在C中存储变量的状态#
- 25. 在C++元编程中存储状态?
- 26. c#继承,静态全局存储
- 27. 如何在一个动态双指针中存储一行C
- 28. C++:传递动态函数和存储函数?
- 29. c#linq到包含动态sql的存储过程的sql
- 30. C#中动态方法的数据库存储
http://jcatki.no-ip.org/fncpp/Resources – 2012-02-13 21:52:29
[阅读一本基本的C++书](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and -list) – 2012-02-13 21:59:39