1
int main()
{

 cout<<"Enter n";

 cin >> n;

 int * a = new int[n];

 a = foo(n);

 free(a);

 return -1;

}

int * foo(int n)
{
 int * a = new int [n];

 if(!a) // what should I return here if allocation of a fails 

 {}

 free(a);


} 

上記のコードでは、関数の戻り値を main から取得しようとしています。関数の戻り値の型は pointer です。ただし、メモリを動的に割り当てています。では、メモリの割り当てに失敗した場合は何を返せばよいでしょうか... NULL のような特別なシンボル。

PS - 非常に基本的な質問であり、Google で検索するための簡潔な形式に私の質問を形式化することはできませんでした。

編集:皆さんありがとうございます。問題を解決しました。

4

7 に答える 7

1

operator newは例外 ( を除くnothrow operator new) をスローするため、この例外をキャッチして を返すnull pointerか、再スローするか、他の例外をスローすることができます。

于 2012-08-19T12:00:33.273 に答える
1

独自のメモリを割り当ててポインタを返す関数からの割り当て失敗の場合、NULL を返すのが慣習です。例を参照してくださいstrdup()。メモリの割り当てに失敗した場合、演算子newはスローすることに注意してくださいstd::bad_alloc。したがって、NULL を返したい場合はこれをキャッチする必要がある場合があります。またはstd::bad_alloc、関数から伝播させることもできます。

ただし、所有権の問題が発生し、メモリリークの可能性が高まるため、そのようなポインタを返すことが常に賢明であるとは限らないことに注意してください。

RAIIのイディオムに固執することで、コードの推論が容易になり、エラーが発生しにくくなることに気付くかもしれません。RAII イディオムの 1 つの結果は、割り当てと割り当て解除が同じコード ユニットによって行われることです。

特定の状況では、配列を割り当てるmain()ので、配列へのポインタを渡し、foo()メモリの割り当てを解除することもできますmain()

また、new割り当てに使用する場合は、適切なバージョンのdelete割り当てを解除する必要があります (ここでdelete[]は配列を割り当てたため)。free()および友人に割り当てられたメモリの割り当てを解除するために使用しますmalloc()

于 2012-08-19T12:00:57.323 に答える
1

割り当てが失敗した場合、オペレーターは例外をnewスローします。bad_allocしたがって、この例外をキャッチしてエラーを処理できます。

例えば:

#include <new> // std::bad_alloc

int* foo(int n)
{
   int* a(new int[n]);

   return a; // I guess you want to return the address stored in a
}

int main()
{
   try
   {
      int* a(foo(n));
   }
   catch(std::bad_alloc& ba)
   {
      // Handle here the error (e.g: std::cerr << "Allocation failed:" << ba.what() << std::endl;)
   }

   return 0;
}

EDIT1: C++11 の機能を使用する場合は、代わりにNULLorを忘れ0て使用してください!nullptr

于 2012-08-19T12:11:19.513 に答える
0

戻り値がポインターの場合、エラーの場合は NULL が最も論理的な値です。例外を発生させることも検討できますが、現時点では NULL を返すことがニーズに合っているはずです。

于 2012-08-19T11:59:52.213 に答える
0

このような場合、 new 演算子は bad_alloc 例外をスローするため、おそらくそれをキャッチして、要件に従って処理する必要があります ( http://www.cplusplus.com/reference/std/new/bad_alloc/ )

于 2012-08-19T12:01:25.043 に答える
0

任意の値を返すことができます。問題は、それを正しく扱わなければならないということです。

于 2012-08-19T12:02:23.863 に答える
0
if(!a) // what should I return here if allocation of a fails 

 { return NULL;}

これは、割り当てが失敗したことを意味します。つまり、NULL ポインターが返されます。

于 2012-08-19T12:03:11.873 に答える