170 похожих чатов

Всем привет, допустим я хочу создать объект не в динамической

памяти, я пишу

Iterator<T>& iterator() {
return DoubleLinkedListIterator<T>(head);
}

теперь в месте, где я вызвал эту функцию, у меня будет ссылка на область памяти в стеке, которая может затереться, если я буду использовать любые другие функции? или есть какой-то механизм, предотвращающий это? если да, то в какой момент времени очистится память, выделенная под этот объект?

16 ответов

12 просмотров

Так нельзя, возврат ссылки на временный объект это выстрел в ногу. Возвращайте не ссылку

Ознакомление с темой lifetime поможет разобрать все по полочкам.

Boris Usievich
Так нельзя, возврат ссылки на временный объект это...

выстрел в ногу по той причине, которую я описал? если так, то мне придется использовать динамическую память для этого. есть вариант, гарантирующий, что я точно не забуду очистить память после использования итератора (или она сама очистится)?

Олег
выстрел в ногу по той причине, которую я описал? ...

Все зависит от реализации. Просто ознакомьтесь с темой времени жизни объектов, включая ссылочные и временные объекты (p, x value). Она очень большая вам вряд-ли будут писать лекции тут.

Тут нет динамической памяти.

НЕ в динамической памяти нет смысла объект создавать В ФУНКЦИИ.

Олег
хорошо, спасибо

Зависит не от реализации С++, а от твоего кода, как ты напишешь. Наверное, мысль была у @gboost такая

Олег
выстрел в ногу по той причине, которую я описал? ...

не нужно в описанном случае использовать никакую динамическую память, просто возвращай DoubleLinkedListIterator по значению. Ну а если везде сплошной полиморфизм, и функция виртуальная - то да, к сожалению, в общем случае придется создавать объект где-то еще.

Anton Semenov
не нужно в описанном случае использовать никакую д...

Проблема с динамиической памятью в том, что мне нужно будет помнить о том, что этот объект нужно очистить после вызова функции. Чувство, что это несколько нарушает инкапсуляцию и думаю, что надо поискать варинат получше. Может есть какие-то умные указатели специально для этого?

Олег
Проблема с динамиической памятью в том, что мне ну...

Конечно, можно отдавать unique_ptr на базовый класс

Mikail Bagishov
Конечно, можно отдавать unique_ptr на базовый клас...

Если я возвращаю юник поинтер по значению, то используется конструкор копирования, верно? Но ведь копирование юник поинтера запрещено

Олег
Если я возвращаю юник поинтер по значению, то испо...

Копирования не происходит. Там будет или перемещение, или некая чуть более хитрая оптимизация с тем же эффектом.

Олег
Если я возвращаю юник поинтер по значению, то испо...

в любом случае у него есть конструктор перемещения

Ilya Zviagin
Неверно. Там делается move.

впервые слышу про такой конструктор) сейчас буду читать про него, но похоже, это то, что мне надо

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

Обсуждают сегодня

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта