私はこのトピックに関する他のいくつかの質問をよく見ましたが、動的に割り当てられたメモリを含むオブジェクトのstlリストとそうでないオブジェクトのstlリストからアイテムを正しく消去する方法に(私の知る限り)対処していません。動的に割り当てられたメモリが含まれています。
オブジェクトのリストを使用したい。たとえば、次のオブジェクトを取り上げます (動的に割り当てられたメモリは含まれません)。
class MyPoint {
public:
MyPoint(int _x,int _y)
{
x = _x;
y = _y;
}
private:
int x;
int y;
};
したがって、オブジェクトのリスト (それらへのポインターではない) を作成し、それに何かを追加してから、要素を消去します。
list<MyPoint> myList;
myList.push_back(MyPoint(3,4));
myList.push_back(MyPoint(1,2));
myList.push_back(MyPoint(8,8));
myList.push_back(MyPoint(-1,2));
list<MyPoint>::iterator it;
it = myList.begin();
advance(it,2);
myList.erase(it);
私のリストには次のものが含まれています: (3, 4) (1, 2) (-1, 2)
質問 1a: 消去されたオブジェクトに対して他に何かする必要がありますか、それともメモリは処理されますか?
質問 1b: プログラムが終了したら、リストに残っているオブジェクトをどうする必要がありますか? それらをすべて削除して、何らかの方法でメモリを処理する必要がありますか?
さて、N 次元空間で点を許可するクラスの代替バージョンを考えてみましょう。つまり、長さ N の配列を動的に割り当てて、クラス内の N 個のポイントを保持することができます (ここでは問題にならないので、実装は割愛します)。クラスのデストラクタは、'delete' を使用して、動的に割り当てられた配列を削除します。
class MyDynamicPoint {
public:
MyDynamicPoint(int N)
{
points = new int[N];
}
~MyDynamicPoint()
{
delete points;
points = NULL;
}
private:
int *points;
};
オブジェクト自体ではなく、オブジェクトへのポインターのリストを作成する場合があります。
list<MyDynamicPoint*> myList;
myList.push_back(new MyDynamicPoint(8));
myList.push_back(new MyDynamicPoint(10));
myList.push_back(new MyDynamicPoint(2));
myList.push_back(new MyDynamicPoint(50));
list<MyDynamicPoint*>::iterator it;
it = myList.begin();
advance(it,2);
myList.erase(it);
質問 2a - 上記は正しいですか? つまり、この新しいバージョンのクラスには動的に割り当てられたメモリが含まれているため、オブジェクト自体ではなく、オブジェクトへのポインターのリストを作成する必要があるということですか?
質問 2b - リストからポインターを消去したばかりですが、オブジェクト内に削除する動的メモリがあるという事実に対処するには、どこで delete を呼び出しますか? それとも、stl list の erase メソッドは、オブジェクトのデストラクタを呼び出して処理しますか?
助けてくれてありがとう、
一番、
アダム