背景
我正在为网络协议编写驱动程序并有一个函数write(std::shared_ptr<package> package)
,其中package
是std::array<buffer_ptr,2>
(0=>header,1=>body)。为方便起见,我想编写一个函数write(buffer_ptr body)
,该函数会自动生成标题并调用write
. 为此,我想要我们std::make_shared
,但是我在std::array
从make_shared
通话中初始化时遇到了问题。
代码
typedef std::shared_ptr<std::vector<uint8_t>> buffer_ptr;
typedef std::array<buffer_ptr, 2> package_t;
typedef std::shared_ptr<package_t> package_ptr;
void connection::write(package_ptr package) {
... //do stuff
}
void connection::write(buffer_ptr body) {
buffer_ptr header = buildHeader(body);
write(std::make_shared<package_t>(???)) //here I want to initialize the array with {header,body}
}
我尝试了什么???
(这些导致编译器错误)
{header, body}
{{header, body}}
std::initializer_list<buffer_ptr>{header, body}
问题:
有没有解决方案来完成这项工作,还是我必须写一些类似的东西:
package_ptr package=new package{header, body}; 写(包);
1.b)我是否会因为不得不求助而失去效率
package_ptr(new package)
?(我记得在一个块中为指针和实例共享分配内存,以节省内存请求)在Cppreference上读取:
此外,如果 g 抛出异常, f(shared_ptr(new int(42)), g()) 可能会导致内存泄漏。如果使用 make_shared 则不存在此问题。
为什么内存会泄漏(可以在被调用之前
int(42)
构造,在g
被g
调用之前shared_ptr
被调用)?1. 中的替代代码是否会遭受这种潜在的泄漏?