回 帖 发 新 帖 刷新版面

主题:C++內存管理

[code]
    for (;;)
    {
        double *d=new double[100000];
        if(d==0)cout<<"Good!"<<'\n';
    }
[/code]
為什麽運行結果是 d 一直都不等於0的!!!
是不是因為我安裝了Visual Assist X???
我記得以前會等於0的啊.

回复列表 (共19个回复)

11 楼

失败了不一定是NULL。但是失败了会抛出异常,在VC中,就是再弹出一个对话框,说你内存访问失败。而这个时候你的程序还没执行到if (d==0)呢。

12 楼

好像各个版本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 楼

對12樓的回覆:
    我是按ctrl+F5全速開的,應該很快就分配完所以內存的了.因為我內存才2G
對11樓的回覆:
    一直都沒有彈出一個對話框說我內存訪問失敗,只有在指針亂指時再訪問指針的內容才有可能會說我內存不能"read".
    
    我用的是VC6.0,大家用的都是 Visual Studio 2005或2008 嗎???他們是用中間語言,我想可能會有點慢哦...
    

14 楼

公司运营 传奇  传世 一条龙 [url=http://www.hainann.com][color=black]最新SF版本[/color][/url]

15 楼

我用VC2005试验了一下,调试的时候在任务管理器里面发现进程所占内存不是递增趋势,但是电脑越来越卡:(

16 楼

我用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 楼

謝謝樓上說得那麼詳細,看來我以後就改用VS2008吧,其實我以前學C#的,所以VS2008我也有.不過不太會用來做C++

18 楼

我Win7用vs2008专业版 用CTRL+F5运行时提示不正常的内存分配
用VS2010 旗舰版 F5运行提示std::bad_alloc
CTRL+F5只会出现 Press any key to continue

19 楼

对于部分安装过特殊内存管理模块(或程序)的机器,在申请内存时总是返回成功的,但此时不真正的分配内存。
当且仅当用户程序在使用已申请分配的内存空间时,系统才会真正分配内存,此时如果失败则结果未知(也就是不确定)

我来回复

您尚未登录,请登录后再回复。点此登录或注册