主题:C++內存管理
josephkwok
[专家分:530] 发布于 2010-06-10 11:09:00
[code]
for (;;)
{
double *d=new double[100000];
if(d==0)cout<<"Good!"<<'\n';
}
[/code]
為什麽運行結果是 d 一直都不等於0的!!!
是不是因為我安裝了Visual Assist X???
我記得以前會等於0的啊.
回复列表 (共19个回复)
11 楼
林杰杰 [专家分:8970] 发布于 2010-06-12 02:18:00
失败了不一定是NULL。但是失败了会抛出异常,在VC中,就是再弹出一个对话框,说你内存访问失败。而这个时候你的程序还没执行到if (d==0)呢。
12 楼
eastcowboy [专家分:25370] 发布于 2010-06-12 05:46:00
好像各个版本VC也不尽相同。
按照C++标准,new分配失败时应该产生std::bad_alloc异常。较新版本的VC,例如VC2005、VC2008等,是按照这个标准来做的,而VC6的new在失败时会返回NULL。这个是以前试验的结果了,不知道有没有记错。
一般的,只有内存不足的时候,才会出现内存分配失败。楼主的代码,每次循环时申请100000个double的空间,这大约是100000*sizeof(double) = 800000个字节,也就是781.25k字节,还不到1M。如果您的剩余内存有512M的话,大约需要循环672次,才会把内存占满(现在的操作系统一般都允许一定量的虚拟内存,所以一般而言,剩余内存是很多的,往往超过1G)。如果您只是按F10、F11这样一步一步的执行,恐怕是难以达到内存占满的地步了。您何不直接按F5,全速执行看看结果?
13 楼
josephkwok [专家分:530] 发布于 2010-06-12 08:18:00
對12樓的回覆:
我是按ctrl+F5全速開的,應該很快就分配完所以內存的了.因為我內存才2G
對11樓的回覆:
一直都沒有彈出一個對話框說我內存訪問失敗,只有在指針亂指時再訪問指針的內容才有可能會說我內存不能"read".
我用的是VC6.0,大家用的都是 Visual Studio 2005或2008 嗎???他們是用中間語言,我想可能會有點慢哦...
14 楼
youxi2010 [专家分:0] 发布于 2010-06-12 10:11:00
公司运营 传奇 传世 一条龙 [url=http://www.hainann.com][color=black]最新SF版本[/color][/url]
15 楼
overfly [专家分:3230] 发布于 2010-06-12 16:26:00
我用VC2005试验了一下,调试的时候在任务管理器里面发现进程所占内存不是递增趋势,但是电脑越来越卡:(
16 楼
eastcowboy [专家分:25370] 发布于 2010-06-13 02:48:00
我用VC2005试验了一下,调试的时候在任务管理器里面发现进程所占内存不是递增趋势,但是电脑越来越卡:(
==========================
分配内存时,如果所占物理内存没有增加,那么所占的虚拟内存应该会有所增加的。
注意任务管理器,显示的“内存使用量”实际上是物理内存使用量。要知道现在的程序除了使用物理内存,还会使用虚拟内存。而虚拟内存一般都是用硬盘来做的,当然卡了。
Windows XP的话,在任务管理器里面,菜单“查看”“选择列”可以选择显示虚拟内存。Windows 7的任务管理器好像没有“虚拟内存”这个列,不过我还是认为程序会使用虚拟内存。
我用的是VC6.0,大家用的都是 Visual Studio 2005或2008 嗎???他們是用中間語言,我想可能會有點慢哦...
==========================
或许您应该先试用一下,反正微软的网站上面就有免费版。只要注册,Professional版可以免费试用一个月,Express版则可以无限期免费使用。
就我的经验而言,Visual Studio 2005编译出来的程序,比Visual C++ 6编译出来的程序快得多(与Visual Studio 6.0相比,Visual Studio 2005的Debug版本特别慢,而Release版本特别快,有些时候甚至有数量级上的差距)。除了工作原因之外,我已经很少使用Visual C++ 6了。
顺带一提,新版本的VC虽然可以编译为.NET的中间语言,但也继承了原来的方式,可以生成高效率的可执行文件。另:目前最新版本其实已经到Visual Studio 2010了,今年四月份才出的正式版,支持C++的一些新语法。
我重新测试了楼主的代码,现在把结果放出来。
测试环境1:Windows 7,内存4G(识别出来只有3G多),虚拟内存由系统自动管理,实际上大概是3G。编译工具为Visual C++ 2008 Express。按F5,以调试方式运行。程序启动之后,很卡,等了一两分钟,Visual C++报错,程序出现异常:std::bad_alloc。这种行为与C++标准所规定的一致。
测试环境2:VM Ware 7.0装的虚拟机,Windows XP,内存1G。虚拟内存为256M。编译工具为Visual C++ 6.0。按F5,以调试方式运行。程序启动之后,不久就开始输出good字样。
其实我在12楼就已经说明了:“较新版本的VC,例如VC2005、VC2008等,是按照这个标准来做的,而VC6的new在失败时会返回NULL。”
不过C++比较灵活,它可以自己定制new/delete,从而实现自己管理内存。但即使是自己定制,最好也是让new/delete的行为符合C++标准,这样才能增加可移植性,与网上下载的其它代码也能更好的结合。
17 楼
josephkwok [专家分:530] 发布于 2010-06-13 09:37:00
謝謝樓上說得那麼詳細,看來我以後就改用VS2008吧,其實我以前學C#的,所以VS2008我也有.不過不太會用來做C++
18 楼
alweeq86 [专家分:1170] 发布于 2010-06-22 09:37:00
我Win7用vs2008专业版 用CTRL+F5运行时提示不正常的内存分配
用VS2010 旗舰版 F5运行提示std::bad_alloc
CTRL+F5只会出现 Press any key to continue
19 楼
cgl_lgs [专家分:21040] 发布于 2010-07-07 23:32:00
对于部分安装过特殊内存管理模块(或程序)的机器,在申请内存时总是返回成功的,但此时不真正的分配内存。
当且仅当用户程序在使用已申请分配的内存空间时,系统才会真正分配内存,此时如果失败则结果未知(也就是不确定)
我来回复