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 所说。