Есть очень мало способов деструктор вызывается:
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 использует "размещение новых" и является высоко вряд ли.
Объекты могут быть уничтожены в моменты, когда удивительно, что они находятся в контейнере, таком как 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 каждый тик/цикл? –
Можем ли мы увидеть код для цикла? – IanPudney
Когда вы задавали свой вопрос, почему вы решили показать нам ничего, кроме деструктора? Вы уже сказали нам, что его зовут, так что, вероятно, это не поможет. Видя цикл, в котором он вызывается, или что вы сделали НЕКОТОРУЮ работу, чтобы определить, что из цикла вызовет деструктор, помогло бы. – kfsone