2014-02-28 52 views
5

作爲前向聲明的重要用戶,我喜歡我的類在銷燬時完成。爲了確保這一點,我做的析構函數的私人和籠絡boost::checked_deleteC++ 11替代boost :: checked_delete

#include <boost/checked_delete.hpp> 

struct MyClass 
{ 
    //MyClass's interface 
    private: 
    ~MyClass() { /* something */ } 
    friend void boost::checked_delete<>(MyClass* x); 
}; 

在C++ 11,std::default_delete還檢查了在破壞完整性。不過,我無法實現相同的行爲上面:

#include <memory> 

struct MyClass 
{ 
    //MyClass's interface 
    private: 
    ~MyClass() { /* something */ } 
    friend struct std::default_delete<MyClass>; 
}; 

int main() 
{ 
    //const std::shared_ptr<MyClass> d { 
    // std::make_shared<MyClass>() 
    //}; //(1) Should compile? 

    const std::shared_ptr<MyClass> d(
    new MyClass,std::default_delete<MyClass>() 
); //(2) Does compile 
} 

不知

  1. 我怎樣才能標註爲(1)編譯行?使用std::make_shared是好事
  2. 是否標記(2)的行真的有效?感覺不好明確指定刪除程序

我使用的是GCC 4.8.0,我檢查了-std = C++ 11和-std = C++ 1y標誌。

+0

什麼你在這方面的意思是「完全」嗎?你能否舉一個例子說明你的「班完成」或「班不完整」是指銷燬?謝謝。 – utnapistim

+0

歡迎來到Stack Overflow。這是一個很好的第一個問題,我已經稍微編輯了一下,包括刪除結尾處的'Thanks,Richel Bilderbeek'。請參閱http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts。 – jerry

+0

刪除不完整類型時,GCC是否發出警告/錯誤?在VC 2013下,我遇到了raw /'shared_ptr'(可以通過正確的選項升級爲錯誤)和static'assertion failure with'unique_ptr'的警告。 – user2802841

回答

0

不要把make_shared呼叫的初始化列表,只是做正常的初始化:

const std::shared_ptr<MyClass> d = std::make_shared<MyClass>(); 

至於第二件事,如果你不指定缺失者那麼這將是默認刪除器。

+1

這可能不是什麼「賦值」的意思...... –

+0

這是一個初始化。 – lrineau

+1

*「如果您沒有指定刪除者,那麼它將成爲默認刪除者。」*對於'unique_ptr',對於'shared_ptr'不適用。後者只會*調用*'delete',也就是說,dtor的效率是'delete p'被調用。沒有指定*這個調用發生在哪裏,我懷疑'default_deleter'被使用(IIRC你可以在簿記對象級別使用繼承,這可以降低空間開銷)。 – dyp

1

像這樣的東西應該工作:

struct wrapper; 

struct MyClass 
{ 
private: 
    ~MyClass() { /* something */ } 
    friend wrapper; 
}; 

struct wrapper 
{ 
    MyClass obj; 
}; 

// ... 

auto const tmp = std::make_shared<wrapper>(); 
std::shared_ptr<MyClass> p(tmp, &tmp->obj);