在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
,这是在所有异常之后,而不是“检查”。我在谈论编码风格。
答案 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)
答案 8 :(得分:1)
在C ++中,new在使用不兼容的编译器时可以返回NULL(参见Will new return NULL in any case?)
但是,C ++中的正确方法是new
在内存不足时抛出异常,就像C#一样。
只有在某些编译器上才需要检查NULL。
答案 9 :(得分:0)
这是你写的一些测试代码吗?如果是这样,我假设您实际上没有保留对您创建的对象的引用,这意味着垃圾收集将启动并删除您之前创建的一些对象。
也就是说,如果你分配了足够的内存并且保持对它的引用,你肯定会耗尽内存(此时会抛出异常 - 作为内存分配的返回值的NULL指针在C中更常见,以及为视频游戏控制台编写的C ++版本。)