@Curssed

Как удалить объект класса?

Есть такой класс:
class point
{
public: 
	int x, y;

	point(int x, int y)
	{
		this -> x = x;
		this -> y = y;
	}

	void show()
	{
		printf("(%d, %d)", x, y);
	}

	void kill()
	{
		delete this;
	}

	~point()
	{
		printf("destruct");
	}
};


Я поместил во внутрь функцию kill, которая должна удалить объект класса, сославшись на него через this.
point a(5, 7);
a.kill(); //удаляем объект, получаем в консоль "destruct"
a.show(); //значения (5, 7) выводятся в консоль

Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает. К нему по прежнему можно обратиться и вывести значения xy. При этом по завершению работы программы, в консоль выводится "destruct" второй раз. То есть объект действительно где-то висит и затем удаляется повторно. Почему так происходит и как правильно уничтожить объект?
  • Вопрос задан
  • 5151 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает.

Тебе предстоит узнать много нового. О том, что такое неопределённое поведение. О том, что удалять опреатором delete можно только объекты созданные оператором new. О том, что обращение к полям объекта после вызова деструктора -- это неопределённое поведение, так же как и вызов деструктора больше чем один раз. О том, что это забота программиста -- следовать правилам языка, а рантайм может закрывать глаза на ошибки, а может громко кричать и завершать программу при первой же возможности.

Она работает и выводит в консоль "destruct". Но после этого объект никуда не исчезает. К нему по прежнему можно обратиться и вывести значения xy. При этом по завершению работы программы, в консоль выводится "destruct" второй раз.

Ну а у меня твоя программа ожидаемо вылетает сразу же в месте вызова delete.

как правильно уничтожить объект?

Объект на стеке можно корректно уничтожить двумя способами: естественным -- выйдя из блока в котором он определён, и насильственным -- вызвав явно его деструктор и создав на его месте другой объект.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы