::Hikaru's blog

調べたこと, 考えたことをメモ.
<< December 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | permalink | - | -
<< auto_ptr_ref | main | 多次元配列の全要素を積算する >>

不完全型のdelete

不完全型(未定義の型)をdeleteした時の動作は未定義です。

ISO/IEC 14882 5.3.5
If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.
(削除されるオブジェクトが削除時点で不完全な型であって、その完全クラスが自明でないデストラクタ又は開放関数をもつ場合、その動作は、未定義とする。)

struct Hoge;
void func1(Hoge* pHoge)
{
  delete pHoge; // Hogeのデストラクタが呼び出されない
}


特にauto_ptrでハマりやすいです。

struct FugaImpl;
struct Fuga
{
  auto_ptr<FugaImpl> m_pImpl;
};

void func2()
{
  Fuga fuga;
} // FugaImplのデストラクタが呼び出されない

boost::shared_ptrではboost::checked_deleterを使い、リンク時に解決させることでこの問題を回避しています。
C, C++ | permalink | comments(0) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

コメントする









この記事のトラックバックURL
http://hikarukaru.jugem.cc/trackback/99
この記事に対するトラックバック