FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

C++11のスマートポインタを導入(ISSに導入)

msyksphinz.hatenablog.com

いろいろ見ていくなかで、スマートポインタは便利そうなので、導入することにした。

github.com

  • src/env.cpp
    m_regs     = std::unique_ptr<Word_t[]>(new Word_t[100]);
    m_memory   = std::unique_ptr<Memory> (new Memory ());
    m_trace    = std::unique_ptr<TraceInfo> (new TraceInfo (this));
    m_func_table = std::unique_ptr<FunctionTable> (new FunctionTable ());
    m_gvar_table = std::unique_ptr<VariableTable> (new VariableTable ());

とりあえずこれでコンパイルは通っている。リグレッションも通っているから大丈夫かな。

ただしここで気をつけなければならないことがあった。Modern Effective C++に書いてある。

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

第4章のスマートポインタの欄に書いてある。 「項目22. Pimplイディオムを用いる際は特殊メンバ関数を用いる」

これは、スマートポインタを解放するときに発生する問題だ。基本的に、ポインタを宣言するときはサイズに関する定義は必要ないが、スマートポインタのデストラクタのコードにはそれが含まれている。 そのため、不完全なクラスをスマートポインタで宣言しても、解放が出来ないため、エラーになってしまう。 同じ問題が、Quitaに書いてあった。まあつまり、デストラクタの解放コードをC++側に書けば良い。

qiita.com