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

C.M*_*.M. 5 c++ c++11 c++14

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

Pot*_*ter 9

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

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

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

std::shared_ptr< T > p = std::make_shared< D >();
Run Code Online (Sandbox Code Playgroud)

演示.

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