C++ 根据 parent 的指针删除 children
C++ deleting children basing on parent's pointer
假设我有 class A:
class A {
A();
};
和class B是A的child:
class B : public A {
B() : A();
~B();
};
和一个指针向量:
std::vector<A*> a_pointers;
现在,我初始化所有内容:
B* b_obj = new B();
a_pointers.push_back(b_obj);
如何删除 b_obj object?应该是这样的吗?
delete a_pointers[0];
有用吗?如果不行,应该怎么做?
您需要为 A 提供一个虚拟析构函数(请参阅 here 了解原因):
class A {
A();
public:
virtual ~A() = default;
};
此时调用 delete a_pointers[0]
将完全破坏 b_obj
。
如果你专门引用局部变量B* b_obj
那么你不需要删除它。局部变量驻留在堆栈中,当您从声明它的函数中 return 时将被清除。
如果您指的是创建并分配给 B* b_obj
的对象(即由 new() 创建的对象,然后将其引用复制到向量中),那么您需要稍后通过调用 delete()
显式删除它(您可能需要遍历向量并删除其所有项目)。
另一件需要注意的重要事情是,您还需要将析构函数声明为虚拟的,如 Nathan Pierson 所说。
假设我有 class A:
class A {
A();
};
和class B是A的child:
class B : public A {
B() : A();
~B();
};
和一个指针向量:
std::vector<A*> a_pointers;
现在,我初始化所有内容:
B* b_obj = new B();
a_pointers.push_back(b_obj);
如何删除 b_obj object?应该是这样的吗?
delete a_pointers[0];
有用吗?如果不行,应该怎么做?
您需要为 A 提供一个虚拟析构函数(请参阅 here 了解原因):
class A {
A();
public:
virtual ~A() = default;
};
此时调用 delete a_pointers[0]
将完全破坏 b_obj
。
如果你专门引用局部变量B* b_obj
那么你不需要删除它。局部变量驻留在堆栈中,当您从声明它的函数中 return 时将被清除。
如果您指的是创建并分配给 B* b_obj
的对象(即由 new() 创建的对象,然后将其引用复制到向量中),那么您需要稍后通过调用 delete()
显式删除它(您可能需要遍历向量并删除其所有项目)。
另一件需要注意的重要事情是,您还需要将析构函数声明为虚拟的,如 Nathan Pierson 所说。