バックグラウンド
ネットワークプロトコル用のドライバーを作成しており、機能があります。write(std::shared_ptr<package> package)
ここで、(0=>ヘッダー、1=>本体) です。便宜上、ヘッダーを自動生成し、 の最初の形式を呼び出す関数 を書きたいと思います。そのためには を使用したいのですが、呼び出しから を初期化する際に問題があります。package
std::array<buffer_ptr,2>
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=新しいパッケージ{header, body}; 書き込み (パッケージ);
1.b) に頼らなければならないことで、効率が低下し
package_ptr(new package)
ますか? (メモリ要求を節約するために、ポインタとインスタンスの共有割り当てメモリを1つのチャンクにしたことを覚えています)Cppreferenceでは次のように読み取ります。
さらに、f(shared_ptr(new int(42)), g()) は、g が例外をスローすると、メモリ リークを引き起こす可能性があります。make_shared を使用すると、この問題は発生しません。
メモリがリークするのはなぜですか (が呼び出される前
int(42)
に構築さg
れ、g
呼び出される前に呼び出される可能性がありますshared_ptr
)? そして、1. の代替コードは、そのような潜在的なリークに悩まされるでしょうか?