Проблема в том, что вы явно вызываете деструктор на a
(a.~arr()
), в то время как деструктор уже будет автоматически вызываться , когда a
выходит из области видимости. в конце main()
. Когда деструктор вызывается во второй раз, он вызывается для уже разрушенного объекта . Технически это приводит к неопределенному поведению (что означает, что любой результат будет нормальным в соответствии со стандартом C ++). На практике этот код, скорее всего, просто снова выполнит деструктор, передав адрес, сохраненный в ячейке памяти, который раньше был a.pool
, в ::operator delete()
(который может быть, а может и не быть тем, что там хранится конструктор), который перехватывается время отладки.
Что вы должны сделать вместо этого, если хотите, чтобы a
был удален в середине main()
, это ввести дополнительную область:
int main()
{
{
arr a;
} //a will be deleted here
// rest of main
}
Другой способ - не использовать автоматический объект, а динамический, для которого вы можете установить время жизни.
Но есть другая проблема с вашим кодом, о которой вы не спрашивали, но на которую я все же чувствую необходимость указать:
Вашему классу срочно требуется конструктор копирования и оператор присваивания . (По крайней мере, объявите их private
, чтобы запретить копирование.) В соответствии с Правилом Три , тот факт, что вам нужен деструктор, должен дать вам подсказку, что два других нужны, поскольку хорошо.
Вы можете избежать всех хлопот, не пытаясь вручную управлять динамически выделяемой памятью. Вместо этого используйте тип, который делает это за вас:
class arr{
public:
arr() : pool(100*sizeof(double)) {
}
// ~arr() // not needed any longer
std::vector<char> pool;
};