您应该使用std::make_shared
来确保带有计数器的块存储在数据旁边。不幸的是,内部std::make_shared<T>
对T
使用零初始化(即使用T()
来初始化数据块)。有没有办法欺骗它使用默认初始化?我知道我可以使用std::shared_ptr<T>( new T, [](auto p){delete p;})
,但我最终会得到两个分配(数据和计数器块不会彼此相邻)。
答案 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 >();
请注意,这对于析构函数是类型安全的。 shared_ptr
总是在析构函数调用之前执行类型擦除并使用动态调度,即使对于简单的POD对象也是如此。