这么写实正规写法。
楼主,你内存不够的时候就会new失败的楼主你的单元测试贴呢?呵呵

解决方案 »

  1.   

    try
    {
     SomeClass* pSC = new SomeClass;
     ...
    }
    cathc(...)
    {
    }
      

  2.   

    2楼的try,catch应该是对的。我认为new成NULL的机会没有,因为内存不够的话在系统的某个 .h 文件中就throw异常了。这个也是我单元测试的一个题目,找到进入==NULL分支的情况,我一直没找到。
      

  3.   

    MFC重载的operator new会扔CMemoryException。
    至于什么时候检测内存分配失败,参考http://www.gotw.ca/publications/mill16.htm
      

  4.   

    不判断不行啊.不判断的程序员可以切jj了.
    try catch 我很少用...
      

  5.   


    是这样的,
    如果你使用了MFC,你没有机会在new失败后进行NULL判断
    如果不使用MFC,则应该进行NULL判断如果吃不准
    那么就在try里面判断一下NULL,双管齐下,多两行代码,没有什么损失,我是这么做的 :)
      

  6.   

    找到进入==NULL分支的情况,我一直没找到。建一个不使用MFC的控制台程序,就可以测到了
      

  7.   

    可以用ASSERT(sc);替换if(sc==NULL)
    说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的
      

  8.   

    可以用ASSERT(sc);替换if(sc==NULL)
    说不定什么时候就会申请失败,虽然发生的机会可以忽略不计,但还是有发生的可能的
      

  9.   

    是这样的,现代的软件工程要求你的代码既要将所有的错误考虑到,又要做到语句、分支的全覆盖。如果你的代码有走不到的地方。比如if new XXX==NULL 如果永远走不到,就应该从代码中删除。那种原来我们写代码的老路子,双保险什么的是不符合软件工程的。所以我才和大家探讨一下这个问题。
    另外,不知道为什么MFC和!MFC的有这种区别。望高手详述一下,谢谢!
      

  10.   

    MFC是对API做了一些封装及自己编的一些类库,其它的类库及API都称为非MFC,提供MFC类库就是为了编程方便而已
      

  11.   


    new 失败,默认情况下,就是返回NULL指针,你必须进行判断,否则出问题的时候会很没有面子
    MFC 对于new 进行了处理,所以不再返回NULL,而是抛出异常你怎么能保证你的c++代码只用于一种编译环境呢?
      

  12.   

    if(ptr == NULL)  或者  try catch。 虽然标准,但这样写代码累死人。 但是也不能不考虑new失败。最好的办法是自己定义new异常处理函数   set_new_handler  可以去了解下相关使用方法
      

  13.   

    可以用宏ASSERT判断,这个宏只在debug版有效,很好用的;
      

  14.   

    如果在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系统下的其他语言我没有测试过。有兴趣的朋友可以用别的语言式式。
      

  15.   

    new是会出std:bad_alloc的异常的,但是本人一向懒惰,就用了另一条路子char* aa = new  (nothrow) char[1024 * 1024 * 1024]; if (aa == NULL) { return -1; }
      

  16.   

    new失败按C++标准是抛出异常,不是根据返回值判断的。
      

  17.   

    就算你判断 照样抛异常 ,你不拦截有时候就崩溃了 。而且 申请内存失败 你的程序离崩溃还远吗?
    其实 判断是否为NULL 意义不大 。。