私のC++プログラムでは、newを使用して1つの関数でオブジェクトを作成します。これらのオブジェクトはセットに挿入されます。セットからオブジェクトを削除したいときは、forループでイテレータを使用します。オブジェクトをセットから削除すると、オブジェクトを削除してメモリを解放する必要がありますが、正しいですか?私はdeleteを使ってみましたが、解放されたポインタが割り当てられていないというエラーが表示されます。では、どうやってこれを行うことができますか?セット内のオブジェクトを削除する方法
ここで私は、オブジェクトを作成し、一連の他の関数で
set <myObject> myobjectlist;
myObject *myobject = new myObject;
myobjectlist.insert(*myobject);
に挿入したコード、私はセットからオブジェクトを削除し、そのメモリを解放しようとしている。
for (set<myObject>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++)
if (i->myObjectID == myObjectID)
{
myobjectlist.erase(*i);
delete &i;
break;
}
は、
「削除」部分がないとうまくいきます。私はオブジェクトのメモリが解放されていないと思ったので、それを追加しました。
彼のコードスニペットに基づいて、このステートメントは誤解を招きます。彼のセットはオブジェクトを価値によって保存するので、消し去ることは彼が新しいもので割り当てたものではありません。 – hifier
いいえ、彼が参照によって削除しているため、そうではありません。彼のセットには、元のオブジェクトの値のコピーが含まれています。値はセットから消去(および破壊)され、イテレータは削除しようとします。有効なブロックを指していないので、イテレータは機能しません。 –
彼のコードはイテレータを削除しようとしませんが、イテレータの_address_を削除しようとします(新しいアドレスで割り当てられたものへのポインタを保持しているアドレスではありません)。しかし、これはポイントではなく、コードは元のオブジェクトをリークされます。 – hifier