C ++ 11在派生类中删除的析构函数

尼基
class B {
    int i;
public:
    B(int param) : i(param) {}
    ~B() = delete;
};
class D : public B {
    int i2;
public:
    D(int p1, int p2) : B(p1), i2(p2) {}
    ~D() = delete;
};

int main() {
    B* instance = new D(1,2);
    return 0;
}

cl test.cpp:

Microsoft (R) C/C++ Optimizing Compiler Version 18.00.31101 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(11) : error C2280: 'B::~B(void)' : attempting to reference a deleted function
    test.cpp(6) : see declaration of 'B::~B'

(在代码上方有一条emply行,因此这些掉了。抱歉)

我有一些特殊的类(一个基类,很多派生类),出于性能原因,它们总是像内存领域一样分配在堆栈中。他们没有收到任何析构函数调用(根据设计,它们不需要这样做)。如果我之后的某些程序员认为他确实需要在其中放置一个向量,这可能是不好的。(内存泄漏,这些类大量产生,并进行了一些函数调用,哎呀)

我尝试使用C ++ 11删除的析构函数。我的问题是:

  • 为什么这不起作用?
  • 还有什么更好的主意,如何在课堂上禁止破坏者或非POD?
皮特·斯科特尼克

为什么这不起作用?

§12.6.2[class.base.init] / p10:

在非委托的构造函数中,可能会调用类类型的每个可能构造的子对象的析构函数(12.4)。[注意:此规定确保了在引发异常的情况下可以为完全构造的子对象调用析构函数(15.2)。尾注]

§12.4[class.dtor] / p11:

[...]如果潜在调用的析构函数被删除或无法从调用上下文访问,则程序格式错误。

如果在构造任何子对象期间引发异常,则编译器将调用已构造的基类和数据成员的析构函数,因此的构造函数D需要一个不可删除的,可访问的析构函数B

还有什么更好的主意,如何在课堂上禁止破坏者或非POD?

在您的情况下,使析构函数protected应该起作用:

class B {
    int i;
public:
    B(int param) : i(param) {}
protected:
    ~B() {}
};
class D : public B {
    int i2;
public:
    D(int p1, int p2) : B(p1), i2(p2) {}
protected:
    ~D() {}
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章