我写一个networkprotocol驱动器和具有功能write(std::shared_ptr<package> package)
,其中package
是std::array<buffer_ptr,2>
(0 =>头,1 =>体)。为了方便,我想编写一个函数write(buffer_ptr body)
,它自动生成头并调用write
的第一种形式。要做到这一点,我想我们std::make_shared
,但我有问题从make_shared
呼叫初始化std::array
。初始化的std ::阵列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包=新包{header,body}; write(package);
1.b)不得不求助于
package_ptr(new package)
? (记得使共享分配存储器的指针,并且在一个组块中的情况下,以节省存储器请求)在Cppreference是读取:
此外,F(shared_ptr的(新INT(42)) ,g())会导致内存泄漏 如果g抛出异常。如果使用make_shared为 ,则不存在此问题。
为什么内存泄漏(可能
int(42)
g
之前构造被调用,g
shared_ptr
之前调用被调用)?那么来自1.的替代代码会遭受这种潜在的泄漏吗?
'写(STD :: make_shared(package_t {标题,正文}) );' –
Cubbi
@Cubbi很好!微软编译器不喜欢它,虽然:( –
@Cubbi:如果'make_shared'抛出(即内存不足)会发生什么?已经构建的'package_t'被泄露? – ted