2010-10-18 83 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