質問: 変数n のどの値で、次のコードはメモリ リークを引き起こしますか?
それがコードです:
int* Bar(int n)
{
if (n == 1)
throw "exception";
return new int[n];
}
void Foo(int n)
{
int *a = Bar(n);
if (n <= 2)
return;
delete[] a;
}
- n が 2 の場合、メモリ リークが発生することは明らかです。
- n が 0 の場合
、メモリ リークが発生する可能性があります ( C++ new int[0] によると、メモリを割り当てますか? ) 。
5.3.4/7から
direct-new-declarator の式の値が 0 の場合、要素のない配列を割り当てるために割り当て関数が呼び出されます。
3.7.3.1/2から
サイズ 0 の要求として返されたポインターを逆参照した場合の影響は未定義です。
また
[新規によって] 要求されたスペースのサイズがゼロであっても、要求は失敗する可能性があります。
つまり、それを行うことはできますが、合法的に (すべてのプラットフォームで明確に定義された方法で) 取得したメモリを逆参照することはできません。配列の削除にのみ渡すことができ、削除する必要があります。
以下は、3.7.3.1/2 の文に付けられた興味深い脚注です (つまり、標準の規範的な部分ではありませんが、説明目的で含まれています)。
[32。その意図は、malloc() または calloc() を呼び出すことによってオペレーター new() を実装できるようにすることなので、ルールは実質的に同じです。C++ は、null 以外のポインターを返すためにゼロ要求を必要とする点で C とは異なります。]
- n が 1 の場合、次のようになります。
int *a = Bar(1) および Bar(1) は例外をスローします。変数 a のコンストラクタで例外になるのでしょうか? そして、それはメモリリークを引き起こしますか?