我寫一個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