删除表达式

Chu*_*dad 3 c++ destructor delete-operator incomplete-type

参考这里

该析构函数还将隐式调用auto_ptr对象的析构函数.这将删除它所持有的指针,指向C对象 - 不知道C的定义!它出现在.cpp文件中,其中定义了struct A的构造函数.

这很奇怪然后

5.3.5/5状态 - "如果被删除的对象在删除时具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为是未定义的."

我的问题是,为什么不是这样的程序试图删除指向不完整类型的指针被视为格式错误?为什么它被推入条件领域(完整的类有一个非平凡的析构函数......)'未定义的行为'?

' '意味着什么?

编辑2:

代码是否格式良好?VS和Gcc/CLang编译,但是Comeau发出警告.我想这一切都是标准中提到的未定义行为的一部分.我的问题是"为什么这不是形成错误但是未定义"?

#include <iostream>
#include <memory>
using namespace std;

struct C;
                        // Is this the POI for auto_ptr<C>? $14.6.4.1/3
struct A{
    A();
    auto_ptr<C> mc;
    ~A(){}             // how does it link to C::~C at this point?
};

struct C{};

A::A():mc(new C){}

int main(){
    A a;
}
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 5

在我写这篇文章时,你的文字说"参考[这里] [1]"没有参考.

但实质上,标准允许您delete指向不完整类型的指针,以便您可以利用编译器不具备的知识,即类型的析构函数不执行任何操作.

std::auto_ptr这是一个问题的例子,特别是对于PIMPL习惯用法(一个臭名昭着的错误例子是Herb Sutter关于PIMPL的GOTW,他错误地使用了它std::auto_ptr).boost::shared_ptr是一个不存在问题的例子(一般而言).这是因为boost::shared_ptr存储构造函数是一个删除函数,并且必须在构造点知道指针的完整类型.

干杯&hth.,