您应该使用std::make_shared以确保带有计数器的块存储在数据旁边.不幸的是,内部std::make_shared<T>使用零初始化T(即用于T()初始化数据块).有没有办法欺骗它使用默认初始化?我知道我可以使用std::shared_ptr<T>( new T, [](auto p){delete p;}),但我最终会得到两个分配(数据和计数器块不会彼此相邻).
创建派生类以强制执行简单的构造.
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对象也是如此.