2014-02-28 41 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);