用[]开数组
int a,b,c;
int arr[50000];
...............///////////////////////////////////////////////////
////////////////////////////////////////////////////用new开数组
int *arr;
mian()
{
arr = new int[50000];
}
有什么不同呢?
解决方案 »
- MFC中,分割视图,用同一个定时器时时控制,这两个视图?
- 求教:CDialog app类和dlg类的关系
- tab控件单击标签怎么没反应?
- 怎样做一个ACDSEE?
- mfc/activex 中 创建了一个基于button 的工程 给button设置 自绘风格 怎么没有WM_DRAWITEM 消息传到 button
- C++中如何实现Press any Key to continue功能
- 检测目标主机是否存在的问题
- 怎样让Dialog Based的程序一启动就隐藏
- 紧急求助:请问怎样调试ActiveX程序???
- 送小分:怎样在一个对话框程序中产生一个HWND视窗?
- VC新手求教~~~~
- 请问怎么CFrameWnd的OnCreateClient 方法才能调用啊?
用[]分配是从栈上分配内存,不需要人为释放,而且分配效率较高。
用new分配是从堆上分配内存,需要你显式的用delete[]释放,不然会造成内存泄漏。
2. 使用方式上的不同
用new比较灵活,可以根据需要动态分配,相对来说使用效率比较高。
用[]开辟的区域,在生命期结束后,系统自动回收;用new分配的区域,必须delete释放,否则生命期与应用程序相同,是内存泄漏的主要原因。
=================================================================================
这么说如果应用程序退出, new分配的内存就自动delete了, 怎么还说 内存泄漏?
========
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207466
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=101344
不过,栈有着一个先进后出这样的一种约定.局部变量,函数参数都是存在于栈空间中的,使用malloc,new开辟的空间都是在堆上的.在堆上开辟的空间一般称为全局数据区域,没有什么访问限制,我的意思是你在这个函数中在堆上开辟空间,在另一个函数中一样可以访问到它,但是局部变量你想想可以吗?
====
对的,在程序没有退出的时候会内存泄漏,
1.静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有密告奶子的变量,我们通过指针间接对其操作。
2.静态对象的分配与释放由编译器自动处理。程序员不需要做任何事情。而动态对象的分配与释放,必须由程序员显示管理。---摘自c++ primer
用new开数组是在栈里开,不用delete就不会释放,一点占用那块内存
======================================================================= 这个问题很有意思,不过不说清楚楼主可能并不知道内存泄漏的巨大隐患和可能带来的巨大灾难。
还是举例来说吧,假设你的应用程序每打开一个文档,需要预先申请 100MB 的空间。
char *tempbuf = new char[100000 * 1024];
但是当你关闭文档的时候,你并没有调用delete 释放内存,你却希望等程序退出以后程序自动释放,好,你这个愿望理论上是可以的。只是...你知道内存是有限的,当你打开100个文档以后,或许你再次申请内存时,系统可用内存已经被消耗殆尽了,这时你的new就会失败,应用程序就会出现异常,电脑就想死机了一样没有反应,你怎么等待你的应用程序结束自动释放内存了呢?这时唯一的办法或许就是kill process即你的应用程序进程或者重启电脑了。