0

STL を利用するリンク リスト タイプの構造を作成する必要がありました。このリンクされたリスト構造からオブジェクトを削除する必要があるメソッドがあります。現在、テーブルを適切に再リンクする方法がありますが、実際にオブジェクトをメモリから正しく削除しているとは確信していません。現在、次のことを行っています。

myItem* item = current; //Current position and item to be deleted.

/* Code to move all elements around */

current = current->next; //Move current position along one in the list.

delete item;

それに対する私の恐れは、アイテム自体を削除するのではなく、現在の場所を移動したら、新しいポインターを作成し、後でポインターを削除することだけです。

少しグーグルで調べて、delete[] コマンドを追加しようとしましたが、セグメンテーション違反が発生したため、コードを次のように編集しました。

myItem* item = current; //Current position and item to be deleted.

/* Code to move all elements around */

current = current->next; //Move current position along one in the list.

delete[] item; //Deletes item at memory location

delete item; //Deletes temporary pointer

コードの一番上の部分に従ってそれを保持すると、プログラムは適切に実行され、本来の動作を実行しますが、メモリフットプリントを適切にクリーンアップしていないのではないかと心配しています.

4

3 に答える 3

1

最初のコード スニペットは問題ありません。あなたがするとき

delete item;

ポインタが指しているメモリを削除しても、ポインタが一時的であることには違いはありません。メモリ内の同じ場所を指す多くのポインタを持つことができますが、それらに含まれるのはそのメモリへのアドレスだけです。それらのいずれかを呼び出すとdelete、そのメモリは削除され、どのポインタを使用しても問題ありません。現在、それらはすべて削除されたメモリを指しているため、使用しないでください。

キーワードdelete[]は配列を削除するためのもので、ポインターが指している場所から始まる配列の長さを探し、配列内のすべての項目を削除するように C++ に指示します。deleteもちろん、リンク リストの項目が配列でない限り、この場合は を使用する必要があります。

また、haole が指摘したように、指定されたオブジェクトがnewキーワードで作成されていることを確認する必要があります。何らかの理由でコード内で対応する C を使用する場合は、常に、、およびとペアnewにします。deletenew TYPE[]delete[]malloc()calloc()free()

于 2013-05-17T22:48:59.963 に答える
1

あなたのしていることは正しいです。ポインタは単なるメモリ アドレスであり、値はそのローカル変数にコピーされます。

たとえば、currentmyItem*ポインタで、アドレス 0XCDEF を指している場合があります。などの代入を行うとmyItem* item = current、そのメモリ アドレスがコピーされるためitem、値は 0XCDEF になります。

したがって、そのポインターを削除すると、それは単に、プログラムがオペレーティングシステムに「ねえ、0XCDEF のこのスペースはもう必要ないので、クリーンアップしてください」と伝えていることを意味します。

于 2013-05-17T22:49:12.527 に答える