C++11 替代提升::checked_delete

C++11 alternative to boost::checked_delete

本文关键字:checked delete C++11      更新时间:2023-10-16

作为前向声明的重度用户,我喜欢我的类在销毁时完成。为了确保这一点,我将析构函数设为私有并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标志。

这样的事情应该可以工作:

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

不要将make_shared调用放在初始值设定项列表中,只需进行正常初始化:

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

至于第二件事,如果您不指定删除器,那么它将是默认的删除器。