私は C++ を初めて使用するので、動的に割り当てられた配列の外側を指しているため、以下のコードがダングリング ポインターまたはメモリ リークの例であるかどうかを尋ねたいと思います。
int * n = new int[10];
for (int prev = 0; prev < 10; prev++) {
*n = *(n + prev + 1);
}
delete[] n;
n = nullptr;
私は C++ を初めて使用するので、動的に割り当てられた配列の外側を指しているため、以下のコードがダングリング ポインターまたはメモリ リークの例であるかどうかを尋ねたいと思います。
int * n = new int[10];
for (int prev = 0; prev < 10; prev++) {
*n = *(n + prev + 1);
}
delete[] n;
n = nullptr;
ダングリング ポインターは、オブジェクトが存在しないアドレスを指すポインターです。つまり、無効なメモリを指しています。「ぶら下がっている」という言葉は通常、有効なものを指すために使用され、何かが破棄されたという意味を持ちます (明示的に割り当てが解除されたか、範囲外になったため)。
動的に割り当てられたメモリの一部がすべて失われると、メモリ リークが発生します。つまり、そのメモリを指していた最後のポインタを「忘れた」場合、そのメモリの割り当てを解除できなくなります。n = nullptr;
を呼び出す前にコードを実行すると、メモリ リークが発生しますdelete[] n;
。
この2 つの用語のいずれかでケースを説明する必要がある場合、それは「ダングリング ポインター」になります。これは、最後の反復でバッファーを超えて到達しているためです。ただし、そもそも有効ではなかったため、通常は「ダングリング ポインター」とは呼びません。これを「バッファ オーバーラン」または「範囲外アクセス」と呼びます。
ダングリング ポインタとメモリ リークの違いは何ですか?
ダングリング ポインターは、メモリ リークの反対であると言えます。
1 つは有効なメモリを指していないポインタで、もう 1 つは何も指していない有効なメモリです。
(しかし、他の回答が指摘しているように、あなたのコードはどちらでもありません。)
最初にいくつかの標準的な例を作成しましょう。
int *x;
x = new int;
x = nullptr;
ヒープに整数を割り当てましたが、それを追跡できなくなりました。delete
この時点では、その整数を呼び出すことはできません。これはメモリ リークです。
int *x;
x = new int;
delete x;
x
はダングリング ポインターになりました。以前は有効なメモリであったものを指しています。この時点で使用する*x
と、アクセスしてはならないメモリにアクセスすることになります。通常、これを解決するには、 の後delete x;
に、x = nullptr;
あなたのコードには別の問題があります。同じことについてより簡単に話せるように、コードを縮小します。
int *x;
x = new int[10];
x[9] = x[10];
私はこれを上記のケースのどちらでもないと説明します。バッファオーバーランです。