こんにちは。
まず、最初にちょっとだけ説明しておきます。
new CApTest;した場合、まずnew演算子でメモリが獲得され、その後、CApTestのコンストラクタが呼ばれます。つまり、コンストラクタがメモリを獲得するわけではないです。コンスラクタが呼ばれる前にC++処理系がメモリを獲得します。newの場合もあれば、今回のご質問のように暗黙的にスタックから確保する場合もあります。
デストラクタも同様です。デストラクタ自体はメモリを開放しません。
C++で下記のような処理(newせずにそのままメソッド呼び出し)を行った場合、コンストラクタ、デストラクタは実行されないのでしょうか?
実行されます。CApTest test;
にてtest変数のメモリがスタック上に確保されます。そして、そのままコンストラクタが呼ばれます。
その後、action()関数の最後に到達後、test変数のメモリがスタックを巻き戻すことで開放されますが、その前にデストラクタが呼ばれます。
もし明示的にデストラクタを呼び出す方法があれば教えていただきたいです。
驚いたことに、単にtest.~CApTest();
で呼べるそうです。(私はやったことはないですが。)
これは本当にデストラクタをただ呼び出します。
その後、action()関数の最後に到達したところで、再度デストラクタが呼ばれ、その後スタックが巻き戻されてメモリが開放されます。
デストラクタが都合2回呼ばれるのでデストラクタの内容によっては問題が発生します。(普通デストラクタが2回呼ばれることは考慮しませんから、やってはいけないことですね。)
CApTestのコンストラクタとデストラクタでstd::coutに出力だけしてみると分かると思います。
この辺の動作については第49章 破壊と創造が分かり易いと思います。でも、そもそも非常に難しいことを解説しているので、かなり読み応えが有ります。
コンソールアプリケーション終了後に下記のコメント部分の箇所でメモリリークが発生していしまいます。
Set()関数の中身が空ならリークしない筈です。単純にSet()関数内でnewなどでメモリ獲得後、開放していないということはないでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/16 12:03