有没有办法欺骗std :: make_shared使用默认初始化?

时间:2017-02-01 06:03:05

标签: c++ c++11 c++14

您应该使用std::make_shared来确保带有计数器的块存储在数据旁边。不幸的是,内部std::make_shared<T>T使用零初始化(即使用T()来初始化数据块)。有没有办法欺骗它使用默认初始化?我知道我可以使用std::shared_ptr<T>( new T, [](auto p){delete p;}),但我最终会得到两个分配(数据和计数器块不会彼此相邻)。

1 个答案:

答案 0 :(得分:9)

创建派生类以强制执行简单的构造。

struct D : T {
    D() {} // Non-trivial constructor. Default-initialize T, which may be trivial.
};

构造派生类,但将其分配给所需的共享指针。

std::shared_ptr< T > p = std::make_shared< D >();

Demo.

请注意,这对于析构函数是类型安全的。 shared_ptr总是在析构函数调用之前执行类型擦除并使用动态调度,即使对于简单的POD对象也是如此。