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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

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;
}
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

19 дек 2007, 09:32

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

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

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

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

int main(int argc, char* argv[])
{
	A a;
}
И в первом, и во втором случае, будет вызван деструктор класса.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

19 дек 2007, 09:46

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

19 дек 2007, 10:03

Почему access violation летит не всегда - это уже вопрос другой. Думаю, что благодаря особенностям Debug генерации кода. Я уверен, что в Release со свистом навернутся все варианты. Такие вещи безнаказанно проходить не могут.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

19 дек 2007, 12:09

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

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