gpt4 book ai didi

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:45 28 4
gpt4 key购买 nike

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

最佳答案

创建一个派生类来执行简单的构造。

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 始终在析构函数调用之前执行类型删除并使用动态分派(dispatch),即使对于简单的 POD 对象也是如此。

关于c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com