памяти, я пишу
Iterator<T>& iterator() {
return DoubleLinkedListIterator<T>(head);
}
теперь в месте, где я вызвал эту функцию, у меня будет ссылка на область памяти в стеке, которая может затереться, если я буду использовать любые другие функции? или есть какой-то механизм, предотвращающий это? если да, то в какой момент времени очистится память, выделенная под этот объект?
Так нельзя, возврат ссылки на временный объект это выстрел в ногу. Возвращайте не ссылку
Ознакомление с темой lifetime поможет разобрать все по полочкам.
выстрел в ногу по той причине, которую я описал? если так, то мне придется использовать динамическую память для этого. есть вариант, гарантирующий, что я точно не забуду очистить память после использования итератора (или она сама очистится)?
Все зависит от реализации. Просто ознакомьтесь с темой времени жизни объектов, включая ссылочные и временные объекты (p, x value). Она очень большая вам вряд-ли будут писать лекции тут.
Тут нет динамической памяти.
НЕ в динамической памяти нет смысла объект создавать В ФУНКЦИИ.
Зависит не от реализации С++, а от твоего кода, как ты напишешь. Наверное, мысль была у @gboost такая
не нужно в описанном случае использовать никакую динамическую память, просто возвращай DoubleLinkedListIterator по значению. Ну а если везде сплошной полиморфизм, и функция виртуальная - то да, к сожалению, в общем случае придется создавать объект где-то еще.
Проблема с динамиической памятью в том, что мне нужно будет помнить о том, что этот объект нужно очистить после вызова функции. Чувство, что это несколько нарушает инкапсуляцию и думаю, что надо поискать варинат получше. Может есть какие-то умные указатели специально для этого?
Конечно, можно отдавать unique_ptr на базовый класс
Если я возвращаю юник поинтер по значению, то используется конструкор копирования, верно? Но ведь копирование юник поинтера запрещено
Копирования не происходит. Там будет или перемещение, или некая чуть более хитрая оптимизация с тем же эффектом.
в любом случае у него есть конструктор перемещения
Неверно. Там делается move.
впервые слышу про такой конструктор) сейчас буду читать про него, но похоже, это то, что мне надо
Обсуждают сегодня