Странная ошибка при удалении объекта

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Странная ошибка при удалении объекта

Re: Странная ошибка при удалении объекта

Фоб » 19 дек 2007, 12:09

Romeo
Ну конечно же, так просто! И как я сам не догадался! :)
Спасибо.

BBB - вот именно!

Re: Странная ошибка при удалении объекта

Romeo » 19 дек 2007, 10:03

Почему access violation летит не всегда - это уже вопрос другой. Думаю, что благодаря особенностям Debug генерации кода. Я уверен, что в Release со свистом навернутся все варианты. Такие вещи безнаказанно проходить не могут.

Re: Странная ошибка при удалении объекта

BBB » 19 дек 2007, 09:46

Romeo писал(а):Да вы, батенька, шаман! Кто же удаляет объекты, созданные на стеке?
Видимо, автор удивлен тем, что в половине его случаев ошибки НЕ ВОЗНИКАЛО :)

Re: Странная ошибка при удалении объекта

Romeo » 19 дек 2007, 09:32

Да вы, батенька, шаман! Кто же удаляет объекты, созданные на стеке? Оператор delete применяется для поинтеров, которые указывают на объекты, созданные оператором new.

Код: Выделить всё

A* pA = new A();
delete pA;
Объекты, созданные на стеке будут автоматически удалены при покидании области видимости объекта (в твоём случае прямо перед выходом из main). Удалять их насильно не просто излишне, а критически неправильно.

Код: Выделить всё

int main(int argc, char* argv[])
{
	A a;
}
И в первом, и во втором случае, будет вызван деструктор класса.

Странная ошибка при удалении объекта

Фоб » 18 дек 2007, 19:22

Это я устал под вечер или...
Смотрим, простейшая ситуация:

Код: Выделить всё

class A{};

int main(int argc, char* argv[])
{
	A a;
	A b;
	delete &a;	// здесь появляется ошибка
	return 0;
}
Возникает исключение "Access violation"

В чём дело, кто-нибудь может объяснить?

Для меня ситуация удивительна и необъяснима, ибо:

Код: Выделить всё

class A{};

int main(int argc, char* argv[])
{
	A a;
	delete &a;	// нет ошибки!
	return 0;
}

Код: Выделить всё

class A{};

int main(int argc, char* argv[])
{
	A a;
	A b;
	delete &b;	// нет ошибки!
	return 0;
}

Код: Выделить всё

class A{};

int main(int argc, char* argv[])
{
	A a;
	A b;
	delete &b;	
	delete &a;	// снова ошибка!!!
	return 0;
}

Вернуться к началу