いろいろ見ていくなかで、スマートポインタは便利そうなので、導入することにした。
- 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項目
- 作者: Scott Meyers,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/09/18
- メディア: 大型本
- この商品を含むブログ (5件) を見る
第4章のスマートポインタの欄に書いてある。 「項目22. Pimplイディオムを用いる際は特殊メンバ関数を用いる」
これは、スマートポインタを解放するときに発生する問題だ。基本的に、ポインタを宣言するときはサイズに関する定義は必要ないが、スマートポインタのデストラクタのコードにはそれが含まれている。 そのため、不完全なクラスをスマートポインタで宣言しても、解放が出来ないため、エラーになってしまう。 同じ問題が、Quitaに書いてあった。まあつまり、デストラクタの解放コードをC++側に書けば良い。