0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

参照渡しによってstd::bad_allocを解決

Last updated at Posted at 2024-08-13

はじめに

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)
{

これによって見事に起こらなくなりました。
セオリー通りですね。

ただし、この記事を執筆する上で、同様の実装をしたサンプルプログラムを書いてみたのですが、同じ現象は起こせませんでした。
ですので、値渡しが直接の原因なのではなく、メモリ不足や不十分な最適化が原因の可能性もあります。

これに関してご知見ある方がいましたら、コメントいただけると幸いです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?