【发布时间】:2018-11-05 15:20:34
【问题描述】:
我有一个class Modal
class Modal {
private:
A* obj1;
B* obj2;
}
其中 A 是 B 的父类
class A {
};
class B : public A {
};
在Modal的析构函数中,我想将obj1和obj2设置为NULL
我创建了一个方便的方法:
void remove(A*& obj) {
if (obj == NULL) { return; }
obj = NULL;
}
在析构函数中我做了这样的事情:
A* objects[] = { obj1, obj2 };
for(auto obj: objects) { remove(obj); }
但它不会将obj1 和obj2 值设置为NULL
如果我直接打电话:
remove(obj1);
它可以正常工作。 那么我在阵列上做错了什么?
还有:
我将obj1 和obj2 放入一个数组的原因是因为我会有更多的对象,并且我想保持删除代码的简短。
【问题讨论】:
-
你确定
obj1不是NULL?在此处使用调试器会有所帮助。 -
这里有很多问题,但首先,在其析构函数中重置类的直接成员是没有意义的。无论如何,它们即将无法使用。
-
Modal的析构函数中不需要将obj1和obj2设置为NULL。一旦析构函数完成,指针将不再存在。如果您尝试将它们设置为 NULL 以强制清除对象点,那么这也不会起作用 - 与其他语言不同,C++ 根本不会那样工作。 -
将循环更改为
for (auto &obj : objects) {remove (obj);}。注意与号。这会将obj1和obj2设置为NULL。根据我之前的评论,无论如何这并没有取得太大的成就,因为当析构函数完成时,指针obj1和obj2将不存在。 -
@Peter,与号仅有助于清除
objects数组中的指针。它不会帮助清除初始化数组的指针。