5

在 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# 中,new 永远不会失败”有关吗?C#中是否有这样的事情new永远不会失败?

如果它失败了,那么为什么这种“检查”在 C# 中如此罕见?我不是在谈论OutOfMemoryException,毕竟是例外,而不是“检查”。我说的是编码风格。

4

10 回答 10

15

根据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();
于 2011-01-22T07:18:01.093 回答
12

在 C# 中,如果失败则new抛出一个,因此不需要检查。OutOfMemoryExceptionNULL

顺便说一句,这同样适用于 C++ -如果失败则new抛出,因此实际上也没有必要在 C++ 中进行测试。std::bad_allocNULL

于 2011-01-22T07:20:51.550 回答
6

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

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

于 2011-01-22T07:21:25.953 回答
5

如果new失败,则会OutOfMemoryException抛出异常。

因此,您拥有的 C++ 代码的等价物将是:

try { 
  Sample sample = new Sample();
} catch(OutOfMemoryException e) {
  Console.WriteLine("Memory allocation failed\n");
}
于 2011-01-22T07:17:35.597 回答
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.

于 2011-01-22T07:21:08.637 回答
1

new 肯定会失败。

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

于 2011-01-22T07:17:22.533 回答
1

C# 中存在 OutOfMemoryException

于 2011-01-22T07:18:05.020 回答
1
  1. 我很少在 C++ 中看到它
  2. 这在 C# 中没有意义,因为它只会抛出一个异常
于 2011-01-22T07:18:53.253 回答
1

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

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

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

于 2011-01-22T07:24:02.003 回答
0

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

也就是说,如果您分配足够的内存并保留对它的引用,您肯定会耗尽内存(此时将引发异常 - NULL 指针作为内存分配的返回值在 C 和 C++ 中更为常见为视频游戏机编写的版本。)

于 2011-01-22T07:18:51.347 回答