keksmen
@keksmen
Just a programmer

Почему деструктор выполняется раньше конструктора копирования?

Здравствуйте, дамы и господа. Представляю вашему вниманию свою проблему.

Есть класс, представляющий собой двусвязный список и хранящий два указателя: на первый и последний элементы списка. Все элементы хранятся в куче и вычищаются в деструкторе.

С этим классом всё было хорошо до того момента, как понадобилось вернуть его экземпляр из функции.
Побитовое копирование, естественно, не подходило, ведь после выполнения деструктора указатели становятся недействительными. "Значит, копирование!" решил я и написал конструктор копирования.

Однако, выяснилось, что даже это не спасёт меня, ведь деструктор экземпляра-оригинала выполняется РАНЬШЕ конструктора копирования! Что делать? Как быть?
Ссылка на код
  • Вопрос задан
  • 470 просмотров
Решения вопроса 3
List<size_t>& newList(size_t a) {
	List<size_t> result;
	result.pushBack(a);
	return result;
}


Вы возвращаете ссылку на локальную переменную. Так делать нельзя, т.к. при выходе из области видимости переменная удаляется, и ссылка будет указывать на мусор.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
По крайней мере у меня G++ выдал предупреждение вот тут:
List<size_t>& newList(size_t a) {
    	List<size_t> result;
    	result.pushBack(a);
    	return result;
    }

C:\TestApps\ListTest\main.cpp | 118 | warning: reference to local variable 'result' returned [-Wreturn-local-addr]
Понятно?

Что изменить…
1. Изменить сигнатуру на…
List<size_t> newList(size_t a) {
2. Поработать с временными ссылками Си++11. Добавить две функции.
List(List<T>&& other);
List<T>& operator = (List<T>&& other);

Два амперсанда — это не ссылка на ссылку (понятие «ссылка» идемпотентно), а новая вещь Си++11 — ссылка на временный объект. Она говорит: объект идёт на заклание, из него можно выпотрошить все данные.
3. Насчёт обычной операции присваивания — её можно или реализовать, или =delete (тоже нововведение Си++11).
4. UPD. Проглючил, но да, верно. Обычный конструктор копирования должен иметь параметр const!
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Слегка поправил ваш код: https://ideone.com/tKCwpR . Там конечно ещё всё очень и очень далеко от идеала, конечно же...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы