RAII和虚析构函数

RAII and virtual destructors

本文关键字:析构函数 RAII      更新时间:2023-10-16

我创建了一个抽象类,然后创建了继承这个抽象类的子类。

class A{
public:
     virtual A* clone() const = 0;
     virtual A* create() const = 0;
    ~virtual A(){};
    // etc.
private:
    A(){};
};

儿童类

class B: public A{};
class C: public A{};

我现在可以使用a类型的指针用这些类填充一个向量,并通过多态性访问子类。

vector<A*> Pntr;

问题是我希望每个子类处理自己的内存释放,有点像RAII。然而,RAII不能与虚拟析构函数一起工作。我能做到吗?

然而,RAII不能与虚析构函数一起工作。

当然有。析构函数的virtual -ness无关紧要。你只需要调用它。当原始指针超出作用域时,它们不会破坏它们所指向的对象。这就是unique_ptr的含义:

std::vector<std::unique_ptr<A>> pointers;

当该向量超出作用域时,所有的unique_ptr<A>将被销毁,这将delete所有它们拥有的底层原始指针,这将酌情调用BC(或…)的析构函数并释放所有内存。

旁注:virtual A()是错误的;不能有虚构造函数。