はじめに
8年ぶりにC++を使ったプロダクト開発に携わることになり、
いわゆるモダンC++に慣れるためにサンプルプロジェクトを作ってみました!
その過程で以下のエラーにはまりました。
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
これを解決した方法を記載したいと思います。
エラー原因
エラーが発生した箇所は明らかで、クラスのインスタンス作成時です。
コンストラクタに引数を渡していて、これを初期化子リストでクラスのメンバーに代入しています。
.cpp
// add input-currency option
std::string input_currency;
app.add_option<std::string>(
"-i, --input-currency",
input_currency,
"Input currency, such as USD, EUR, JPY, and so on");
// add output-currency option
std::string output_currency;
app.add_option<std::string>(
"-o, --output-currency",
output_currency,
"Output currency, such as USD, EUR, JPY, and so on");
...
auto fx = std::make_shared<Fx>(input_value);
auto fx_interface = FxInterface(fx, input_currency, output_currency);
引数として渡しているのはコマンドラインから入力された文字列で、CLI11をつかってパースしています。
解決方法
タイトルにもある通り、コンストラクタの引数を参照渡しで受け取るようにしました。
.cpp
FxInterface::FxInterface(std::shared_ptr<Fx> p_fx, std::string const &input_currency, std::string const &output_currency)
: m_fx(std::move(p_fx)), m_input_currency(input_currency), m_output_currency(output_currency)
{
これによって見事に起こらなくなりました。
セオリー通りですね。
ただし、この記事を執筆する上で、同様の実装をしたサンプルプログラムを書いてみたのですが、同じ現象は起こせませんでした。
ですので、値渡しが直接の原因なのではなく、メモリ不足や不十分な最適化が原因の可能性もあります。
これに関してご知見ある方がいましたら、コメントいただけると幸いです。