有没有朋友new类实例的时候总是喜欢判断一下是不是为NULL? 这么写实正规写法。楼主,你内存不够的时候就会new失败的楼主你的单元测试贴呢?呵呵 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 try{ SomeClass* pSC = new SomeClass; ...}cathc(...){} 2楼的try,catch应该是对的。我认为new成NULL的机会没有,因为内存不够的话在系统的某个 .h 文件中就throw异常了。这个也是我单元测试的一个题目,找到进入==NULL分支的情况,我一直没找到。 MFC重载的operator new会扔CMemoryException。至于什么时候检测内存分配失败,参考http://www.gotw.ca/publications/mill16.htm 不判断不行啊.不判断的程序员可以切jj了.try catch 我很少用... 是这样的,如果你使用了MFC,你没有机会在new失败后进行NULL判断如果不使用MFC,则应该进行NULL判断如果吃不准那么就在try里面判断一下NULL,双管齐下,多两行代码,没有什么损失,我是这么做的 :) 找到进入==NULL分支的情况,我一直没找到。建一个不使用MFC的控制台程序,就可以测到了 可以用ASSERT(sc);替换if(sc==NULL)说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的 可以用ASSERT(sc);替换if(sc==NULL)说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的 是这样的,现代的软件工程要求你的代码既要将所有的错误考虑到,又要做到语句、分支的全覆盖。如果你的代码有走不到的地方。比如if new XXX==NULL 如果永远走不到,就应该从代码中删除。那种原来我们写代码的老路子,双保险什么的是不符合软件工程的。所以我才和大家探讨一下这个问题。另外,不知道为什么MFC和!MFC的有这种区别。望高手详述一下,谢谢! MFC是对API做了一些封装及自己编的一些类库,其它的类库及API都称为非MFC,提供MFC类库就是为了编程方便而已 new 失败,默认情况下,就是返回NULL指针,你必须进行判断,否则出问题的时候会很没有面子MFC 对于new 进行了处理,所以不再返回NULL,而是抛出异常你怎么能保证你的c++代码只用于一种编译环境呢? if(ptr == NULL) 或者 try catch。 虽然标准,但这样写代码累死人。 但是也不能不考虑new失败。最好的办法是自己定义new异常处理函数 set_new_handler 可以去了解下相关使用方法 可以用宏ASSERT判断,这个宏只在debug版有效,很好用的; 如果在windows上,我也认为判断是没有用的。我做了一个小小的测试,我就不上图了,我使用的是vs2008,代码如下:int _tmain(int argc, _TCHAR* argv[]){ char* aa = new char[1024 * 1024 * 1024 * 2]; return 0;}意思是我要申请2G的内存空间,结果编译时,编译器直接给我报错了,告诉申请的空间过大。当然,有的朋友可能说,在大的工程中不会申请那么多内存,内存可能随着程序的执行而变大,即使是申请几K的内存也有可能有申请不到的时候。我做过流媒体播放相关的程序,当时程序存在内存泄露,当进程内存占用很多的时候,再次申请,程序直接崩溃,根本不会给你判断是否为NULL的操作;可以写一个简单的测试代码:int _tmain(int argc, _TCHAR* argv[]){ for ( int i = 0; i < 3; i++) { char* aa = new char[1024 * 1024 * 1024]; if (aa == NULL) { return -1; } } return 0;}如上面代码,你根本没有执行到return -1的机会,直接崩溃掉。出于以上的代码测试,我认为判断NULL没有必须,当然前提是在Windows系统下,并且是使用C++。至于别的系统或windows系统下的其他语言我没有测试过。有兴趣的朋友可以用别的语言式式。 new是会出std:bad_alloc的异常的,但是本人一向懒惰,就用了另一条路子char* aa = new (nothrow) char[1024 * 1024 * 1024]; if (aa == NULL) { return -1; } new失败按C++标准是抛出异常,不是根据返回值判断的。 就算你判断 照样抛异常 ,你不拦截有时候就崩溃了 。而且 申请内存失败 你的程序离崩溃还远吗?其实 判断是否为NULL 意义不大 。。 VC中怎么注册USB设备怎么弄啊 DLL导出类的问题 谁能告诉我? 在使用Edit标准控件时遇到的问题(要求输入的数只在某一范围之内) 拜求高手:WINAMP播放URL的原理 很弱智的问题,不过的确很烦 那些文件可删除 我用的是VC6开发个MIS系统,如何可以确定一个数据库里有没有一个表的存在啊? 关于消息派发问题 VC电源管理,是高手就进! 数据库问题 atl 编写ie工具条
{
SomeClass* pSC = new SomeClass;
...
}
cathc(...)
{
}
至于什么时候检测内存分配失败,参考http://www.gotw.ca/publications/mill16.htm
try catch 我很少用...
是这样的,
如果你使用了MFC,你没有机会在new失败后进行NULL判断
如果不使用MFC,则应该进行NULL判断如果吃不准
那么就在try里面判断一下NULL,双管齐下,多两行代码,没有什么损失,我是这么做的 :)
说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的
说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的
另外,不知道为什么MFC和!MFC的有这种区别。望高手详述一下,谢谢!
new 失败,默认情况下,就是返回NULL指针,你必须进行判断,否则出问题的时候会很没有面子
MFC 对于new 进行了处理,所以不再返回NULL,而是抛出异常你怎么能保证你的c++代码只用于一种编译环境呢?
{ char* aa = new char[1024 * 1024 * 1024 * 2]; return 0;
}意思是我要申请2G的内存空间,结果编译时,编译器直接给我报错了,告诉申请的空间过大。
当然,有的朋友可能说,在大的工程中不会申请那么多内存,内存可能随着程序的执行而变大,即使是申请几K的内存也有可能有申请不到的时候。我做过流媒体播放相关的程序,当时程序存在内存泄露,当进程内存占用很多的时候,再次申请,程序直接崩溃,根本不会给你判断是否为NULL的操作;可以写一个简单的测试代码:
int _tmain(int argc, _TCHAR* argv[])
{ for ( int i = 0; i < 3; i++)
{
char* aa = new char[1024 * 1024 * 1024];
if (aa == NULL)
{
return -1;
}
} return 0;
}如上面代码,你根本没有执行到return -1的机会,直接崩溃掉。
出于以上的代码测试,我认为判断NULL没有必须,当然前提是在Windows系统下,并且是使用C++。至于别的系统或windows系统下的其他语言我没有测试过。有兴趣的朋友可以用别的语言式式。
其实 判断是否为NULL 意义不大 。。