我對這個主題的其他一些問題有很好的看法,但他們都沒有(據我所知)解決了如何正確地從stl中刪除項目包含動態分配內存的對象列表與不包含動態分配內存的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的擦除方法調用對象的析構函數,照顧它?
提前爲任何幫助非常感謝,
最佳,
亞當
* 「一旦你解決你的類將被照顧的」 * - 不,不會。他在第二個版本中存儲指向動態分配對象的指針。 – 2013-03-16 14:55:48
@BenjaminLindley:你是對的,我忽略了這一點。讓我擴大答案。 – NPE 2013-03-16 14:57:19
我沒有看到一個清楚的理由來贊同'std :: shared_ptr'而不是'std :: unique_ptr'。我認爲在缺少更多信息的情況下,應該使用後者。 – juanchopanza 2013-03-16 15:00:51