4

だから、ここにこの質問を説明する私の例があります

void * p1;
int * p2, * p3;

p2 = new int;
p1 = p2;
p3 = (int *) p1;

メモリを解放するには、次の3行は互いに同等ですか?

delete p2;
delete p3;
delete (int *) p1;

私がそのようなものを使用している理由は、その型を知らずに関数間でポインターを渡したいからです。たとえば、void ポインターを定義し、次のように他の関数を呼び出してその値を変更します。

void * p1;
func1(p1); //in this function, p2 = new int and  p1 is assigned as p1 = p2;
func2(p1); //in this function, p1 is assigned to another pointer: int * p3 = (int *)p1;

次に、 func3 を呼び出してメモリを解放しました

func3(p1); //delete int * p1

func3 を呼び出した後、もう func1 で p2 を処理する必要がありますか?

ありがとう!

4

4 に答える 4

8

はい、すべての 3 deletes は同等です。投稿された例では、3 つのポインターすべてが同じものを指していることに注意することが重要です。これは、それらのうちの 1 つを使用している場合、それらが指すメモリが既に解放されているため、他のものを使用しdeleteないでください。delete

deleteすでにリリースされているものを試してみると、未定義の動作が発生します。運が良ければプログラムはクラッシュしますが、何かが起こる可能性があります。

于 2012-11-06T21:00:55.417 に答える
7

質問には誤解が含まれています。ポインターを削除しないでください。それらが指すものを削除します。

また、同じものを複数回削除することはできません。

3 人が同じ箱に指を向けているとします。そのうちの1人は「捨てる」と言います。投げた後は、指を同じ方向に向けたまま、空のスペースに向かって残ります。もう捨てるものは何もない。

于 2012-11-06T21:08:03.807 に答える
3

割り当ては 1 つしかないため、必要な削除は 1 つだけです。そのメモリ (ポインタ) を見つけることができるアイテムが 3 つあるため、O/S に解放するためにはどれでもかまいません。O/S に解放されたら、古いポインタを使用しないように注意してください。これらのポインタは、解放されたメモリの古いアドレスを保持しているためです。解放されたメモリを使用するのは悪いことです。

于 2012-11-06T21:01:01.517 に答える
0

はい、3つすべてが同等です。deleteを呼び出した後に実行したいのは、ポインターをnullptrに設定して、ポインターが無効になったことを確認できるようにすることだけです。

p1 = nullptr ;
p2 = nullptr ;
p3 = nullptr ;

ポインタがメモリを指していることを忘れないでください。これを行うとき:

p2 = new int;

あなたは「私に新しいメモリを宣言し、そのアドレスをp2に保持する」と言っています。これで、p2を使用してそのメモリにアクセスできます。

これを行うとき:

p1 = p2;

あなたは「p1がp2が指しているのと同じメモリを指しているようにしたい」と言っています。これで、同じメモリを指す2つのポインタができました。

いずれかのポインタでdeleteを呼び出すと、そのメモリが削除され、それらのすべてのポインタが同じ解放されたメモリを指すようになります(つまり、無効になります)。

メモリを解放した後に行う通常のことは、ポインタ変数をスコープ外にするか、nullptrに設定して、無効になったことを検出できるようにすることです。

于 2012-11-07T11:56:20.013 に答える