2016-12-12 13 views
1

ヒープ上に作成され、関数によって返された配列を削除できますか?

Int * temp=something(5); 
// use the array.... 


delete [] temp; 

...さんは

のようにどこかにそれを使用する場合は、次に機能

int * something (int size){ 
    int * sample= new int[size]; 
    //... do something 
    return sample; 
} 

があるとしましょう....

このつもり原因MEMリークです??

+2

いいえ、漏れは発生せず、完全に合法です。 –

+3

*しないと、メモリリークが発生します。 'あなたは'あなたが 'new'をいつも'削除 'し、 '新しい[]'を 'delete []'するべきです。 –

+2

ダイナミックアロケーションが必要な場合は、 'std :: vector'を使用することをお勧めします。あなたはこれらのことを心配する必要はありません。 –

答えて

1

正当だがエラーが発生しやすいのは、割り当てられている配列と割り当てが解除されている配列の間に例外があるとメモリリークのリスクがあるためです。このコードを例外セーフにするためにスマートポインタを使用する方が効果的です。

はい、あなたは限り、あなたは限りポインタはまだ配列がまだ他の場所で、あなたのコード内の割り当てが解除されなかった同じアドレス上にポイントと同じ型のポインタを使用するようnew[]編以前だったかdelete[]することができます(いわゆる「ダブルフリー」問題)。 3つの要件がすべて満たされていなければなりません。そうしないと、定義されていない動作が実行され、すべてのベットがオフになります。

+0

おそらく、RAIIベースのソリューション(例: 'unique_ptr '、 'std :: vector ' ...など) – KABoissonneault

関連する問題