デストラクタが呼び出される方法はほとんどありません。
1) スタック上に のインスタンスを作成するDrawable
と、スコープ外になります。これがタイトなループで行われると、オブジェクトは範囲外になり、ループの反復ごとに破棄されます。例えば:
for (size_t i = 0; i < 100; ++i)
{
Drawable d;
}
ここでは、各ループの開始時と終了時に の 100 個のインスタンスDrawable
が作成および破棄されます。
2)delete
動的に割り当てられたDrawable
:
for (size_t i = 0; i < 100; ++i)
{
Drawable* d = new Drawable;
delete drawable;
}
3) デストラクタを明示的に呼び出します。
Drawable* b = new (buffer) Drawable;
b->~Drawable()
#3 は「placement new」を使用しており、その可能性は非常に低いことに注意してください。
オブジェクトは、vector
. 検討:
vector <Drawable> drawables;
for (size_t i = 0; i < 10000; ++i)
{
Drawable d;
drawables.push_back (d);
}
このコードを実行すると、潜在的に多くのデストラクタ呼び出しに気付くでしょう。するとpush_back
、コピーが作成される可能性があり、オリジナル (d
ここ) は破棄されます。また、vector
容量に達すると、再割り当てする必要があり、その結果、すべてのアイテムが再度コピーされ、元のアイテムが破棄されます。
オブジェクトは、一時的なコピーや予期しないコピーに直面して、驚くべき時に破壊されることもあります。検討:
void DoSomething (Drawable d)
{
}
int main()
{
Drawable d;
for (size_t i = 0; i < 1000; ++i)
{
DoSomething (d);
}
}
この場合、コンパイラは一時変数を除外する可能性が高いため、これは単純な例です。しかし、値DoSomething()
を取るため、元のコピーを作成できます。他のコードによっては、コンパイラはこのコピーを除外することさえできない場合があります。Drawable