C++の覚書 デストラクタの注意点

今後の注意点として書いておく。
結論からいうとクラスを宣言したスコープでexit関数を呼び出すとそのクラスのデストラクタは呼び出されない。
以下がその例。

#include <iostream>

class hoge {
public:
    hoge() { std::cout << "called instance" << std::endl; };
    ~hoge() { std::cout << "called destractor" << std::endl; };
};

int main(int argc, char *argv[])
{
    hoge a;
    exit(EXIT_FAILURE);
    return 0;
}

実行結果

called instance

対策として

  • exit関数で終了しない
  • staticを付ける
int main(int argc, char *argv[])
{
    static hoge a;
    exit(EXIT_FAILURE);
    return 0;
}
hoge a;
int main(int argc, char *argv[])
{
    exit(EXIT_FAILURE);
    return 0;
}