2010-10-18 86 views
3

参考here删除表达

即析构函数将也隐含 呼叫的auto_ptr 对象的析构函数。而这将删除 指针其持有,这点到C 对象 - 不知道C的 定义!这出现在定义了结构A的构造函数 的 .cpp文件中。

这是好奇然后

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; 
} 

回答

5

正如我在写这篇文章时所说的“Reference [here] [1]”没有提及。

但基本上,该标准允许您指定一个指向不完整类型的指针,以便您可以利用编译器不具备的知识,即该类型的析构函数什么都不做。

std::auto_ptr是一个例子,这是一个问题,尤其是对于PIMPL方法(犯错是香草萨特的GOTW上PIMPL,在那里他使用不当std::auto_ptr的一个臭名昭著的例子)。 boost::shared_ptr是一个例子,它不是一个问题(一般)。这是因为boost::shared_ptr的构造函数存储了删除函数,并且必须在构造点处知道指针的完整类型。

干杯& hth。,

+0

是的。这是我的忽视。更新它 – Chubsdad 2010-10-18 06:10:36

+0

+1,有趣。这是否真的发生过,有必要删除一个POD类型而没有它的定义?没有琐碎的析构函数的类是不是最不可能不完整的? Hmfph。 – Potatoswatter 2010-10-18 06:27:34

+0

你能否提供一个参考文章/材料,你提到gotw? – Chubsdad 2010-10-18 07:37:55