【问题标题】:RAII and virtual destructorsRAII 和虚拟析构函数
【发布时间】:2015-07-16 19:50:59
【问题描述】:

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

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 不适用于虚拟析构函数。有什么办法可以做到吗?

【问题讨论】:

  • 仅供参考,构造函数不能是virtual,只有方法和析构函数可以。
  • The Definitive C++ Book Guide and List 可能会有所帮助。
  • “我希望每个子类处理自己的内存释放” - 这是什么意思?
  • RAII 在任何现实场景中根本不起作用。它仅适用于 POD,不适用于 OOP

标签: c++


【解决方案1】:

但是 RAII 不适用于虚拟析构函数。

当然可以。析构函数的virtual-ness 无关紧要。你只需要实际调用它。当原始指针超出范围时,它们不会破坏它们指向的对象。这就是unique_ptr 的用途:

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

当该向量超出范围时,所有unique_ptr&lt;A&gt; 将被销毁,这将delete 他们拥有的所有底层原始指针,这将调用BC 的析构函数(或...)酌情释放所有内存。

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

猜你喜欢
  • 2017-05-31
  • 2013-07-06
  • 2011-08-12
  • 2012-04-13
  • 2012-04-18
  • 2018-11-26
  • 2017-03-16
  • 2012-12-20
  • 2014-11-04
相关资源
最近更新 更多