新的永不失败?

时间:2011-01-22 07:15:04

标签: c# c++ memory-management dynamic-memory-allocation

在C ++中,我们通常会看到和编写像

这样的代码
Sample sample=new Sample();
if ( sample == NULL )
{
     std::cout<<"Memory allocation failed" << std::endl;
}

但是在C#中,我很少看到这个:(至少我从未见过这个)

Sample sample = new Sample();
if ( sample == null )
{
     Console.WriteLine("Memory allocation failed\n");
}

意味着,在C#中,如果new失败,我们很少检查。为什么会这样?它是否与“在C#中,新的永不失败”有关?在C#中有这样的事情,new永远不会失败吗?

如果失败了,为什么这样的“检查”在C#中如此罕见?我谈论OutOfMemoryException,这是在所有异常之后,而不是“检查”。我在谈论编码风格。

10 个答案:

答案 0 :(得分:14)

根据msdn

  

如果new运算符无法分配内存,则抛出异常OutOfMemoryException。

http://msdn.microsoft.com/en-us/library/51y09td4%28v=vs.71%29.aspx

顺便说一下,只有旧的C ++编译器在尝试分配内存时返回0。现代的抛出std :: bad_alloc异常。如果你希望旧的行为,你需要写

Sample sample=new(std::nothrow) Sample();

答案 1 :(得分:12)

在C#中,new如果失败则会引发OutOfMemoryException,因此无需进行NULL检查。

顺便提一下,同样适用于C ++ - new如果失败则抛出std::bad_alloc,因此确实无需在C ++中对NULL进行测试。

答案 2 :(得分:6)

在C ++中,与malloc不同,new在失败时不会返回NULL。实际上,它会在失败时引发std::bad_alloc异常。

如果您希望new在失败时返回NULL,则必须明确告诉它不要抛出异常。为此目的使用std::nothrow版本。 (头文件:<new>

答案 3 :(得分:5)

如果new失败,则会抛出OutOfMemoryException

所以你所拥有的C ++代码就相当于:

try { 
  Sample sample = new Sample();
} catch(OutOfMemoryException e) {
  Console.WriteLine("Memory allocation failed\n");
}

答案 4 :(得分:5)

Sample sample=new Sample();
if ( sample == NULL )
{
     // You will never get here!
     std::cout<<"Memory allocation failed" << std::endl;
}

我们也不用C ++编写。 "Memory allocation failed"永远不会出现。如果分配失败,在两种语言中都会出现异常。在C ++中,它是std::bad_alloc,在C#中是OutOfMemoryException

答案 5 :(得分:1)

新的肯定会失败。

允许构造函数抛出异常。 创建新对象时也可能会耗尽内存。

答案 6 :(得分:1)

C#中有一个OutOfMemoryException

答案 7 :(得分:1)

  1. 我很少在C ++中看到它
  2. 在C#中没有意义,因为它只会抛出异常

答案 8 :(得分:1)

在C ++中,new在使用不兼容的编译器时可以返回NULL(参见Will new return NULL in any case?

但是,C ++中的正确​​方法是new在内存不足时抛出异常,就像C#一样。

只有在某些编译器上才需要检查NULL。

答案 9 :(得分:0)

这是你写的一些测试代码吗?如果是这样,我假设您实际上没有保留对您创建的对象的引用,这意味着垃圾收集将启动并删除您之前创建的一些对象。

也就是说,如果你分配了足够的内存并且保持对它的引用,你肯定会耗尽内存(此时会抛出异常 - 作为内存分配的返回值的NULL指针在C中更常见,以及为视频游戏控制台编写的C ++版本。)