我已经很好地查看了有关此主题的其他一些问题,并且(据我所知)没有一个解决如何正确地从包含动态分配内存的 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方法调用对象的析构函数,照顾它?
非常感谢您的帮助,
最好的,
亚当