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しません。なぜそうなのですか?「In C#, new never fails」と関係がありますか? 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スローさstd::bad_allocれるため、C++ でもテストする必要はありませんNULL

于 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

C++ では、準拠していないコンパイラを使用すると new が NULL を返すことがあります ( Will new return NULL in any case?を参照してください) 。

ただし、C++ での適切な方法は、newC# と同様に、メモリ不足のときに例外をスローすることです。

NULL のチェックは、特定のコンパイラでのみ必要です。

于 2011-01-22T07:24:02.003 に答える
1

C# には OutOfMemoryException があります

于 2011-01-22T07:18:05.020 に答える
1
  1. C++ではめったに見ません
  2. C# では意味がありません。単純に例外をスローするだけだからです。
于 2011-01-22T07:18:53.253 に答える
1

新しいものは確かに失敗する可能性があります。

コンストラクターは例外をスローできます。また、新しいオブジェクトを作成するときにメモリ不足になることもあります。

于 2011-01-22T07:17:22.533 に答える
0

これはあなたが書いたテストコードですか?もしそうなら、作成したオブジェクトへの参照を実際に保持していないと思います。つまり、ガベージ コレクションが開始され、以前に作成したオブジェクトの一部が削除されます。

そうは言っても、十分なメモリを割り当ててそれへの参照を保持している場合、確かにメモリが不足する可能性があります (その時点で例外がスローされます。メモリ割り当ての戻り値としての NULL ポインターは、C と C++ でより一般的です)。ビデオ ゲーム コンソール用に作成されたバージョン)。

于 2011-01-22T07:18:51.347 に答える