1

私はC++でリンクリスト用のプログラムを作っていました。このコンセプトを実装するために、リストの最初の要素を指し示すポインタ 'start'をグローバルに作成しました。以前に動的に割り当てられたが、別のポインタで割り当てられたメモリを削除できますか?

プログラムの終了後、私はメモリリークを防ぐために、割り当てられたすべてのメモリを削除しようとしました。 ここでは、同じ正しいアドレスを指すポインタを使用しましたが、このポインタはメモリ割り当てに使用されたポインタではありませんでしたが、通常のポインタのようにローカルに宣言されています。

私の質問です - 同じ場所を指す通常のポインタを使用して動的に割り当てられたメモリを削除することは可能ですか?ポインタはあなたがnewから戻ったものと同じ型と値 を持っているよう

+1

[別のポインタから割り当てられたポインタを削除して、別のポインタをもう一度削除する必要がありますか?](https://stackoverflow.com/questions/13259305/delete-pointer-that-is-assigned-from- another-pointer-should-i-delete-the-other) –

+1

アドレスを指していると考えてはいけません。アドレスであると考えてください(そして、そのアドレスのオブジェクトを指しています)。あなたが35 Main Streetで家を壊すつもりなら、住所がどのように伝えられたかは関係ありません。それはまだ同じ家です。 – molbdnilo

+1

@molbdnilo:あなたも37を上げてもらえますか?そして、日の出は数字36から見ることができます。 – Bathsheba

答えて

4

はいできます。これは有効です。new[]を使用して

int* p = new int; 
int* q = p; 
delete q; 

同等:あなたのポインタ型と

int* p = new int[123]; 
int* q = p; 
delete[] q; 

代替int*。後でnullptrへのポインタを設定するかどうかは議論の対象となります。

+0

const int * q = pであることに注意してください。 qを削除する。私はそれについての標準的な参考文献を見たいと思っていますが、動作します。 – Bathsheba

+0

@Bathsheba確かに。一見したところ、それは直観に反しているように思えるかもしれませんが、私は 'const'は〜不可能ではないと言います。 – Ron

+1

@Bathsheba C++ 14 [expr.delete]/2最終ノート –

1

長いので、はいあなたはdelete引数としてそれを使用することができます。

また、new[]を使用した場合は、delete[]を必ず使用してください。


修飾子constvolatile)は重要ではありません。仮想デストラクタで基本クラスへのポインタを使用することもできます。

+0

"同じタイプ":仮想デストラクタを持つ基底クラスも同じ型に含まれています – UKMonkey

+0

@UKMonkey、それを挟んで、明瞭な良心を維持するためにwikiされます。 – Bathsheba

関連する問題