Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
4 / 4 / 1
Регистрация: 17.12.2015
Сообщений: 119

Правильное освобождение памяти при std::vector

17.08.2016, 15:41. Показов 8816. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
vector<Worker*> workers;
workers.push_back(new Worker("Jack", 1000))
Как теперь правильно освободить память? Как я понял у вектора есть своё освобождение, но оно освобождает массив указателей, а мне надо освободит то, что по адресу указателей.

P.S. мне кажется, то, что сделал я - это очень плохо. Надеюсь, я не прав, и это можно нормально решить)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2016, 15:41
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Правильное освобождение памяти
Есть код class Test { public: int **container; int counter = 0; Test(unsigned int size) { container = new int*;

Правильное освобождение памяти
Здрасти. Двумерный динам. массив: int** matr=new int*; for (int i=0; i&lt;rows; ++i) matr=new int; ...

46
2405 / 1935 / 763
Регистрация: 27.07.2012
Сообщений: 5,574
17.08.2016, 17:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GbaLog- Посмотреть сообщение
Не?
Не. После первого пуш-бэка воркер уже не воркер, а хзч.
1
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.08.2016, 17:31
Не, unique_ptr - некопируемый. Вы хоть проверили, то что написали?

Не по теме:

ушёл домой, отвечу не скоро

1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.08.2016, 17:33
Цитата Сообщение от Operok Посмотреть сообщение
Вы хоть проверили, то что написали?
Нет, я же просто предположил. Просто забыл, что такое unique_ptr.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.08.2016, 17:40
Цитата Сообщение от John Prick Посмотреть сообщение
Не. После первого пуш-бэка воркер уже не воркер, а хзч.
ну можно и так например:
C++
1
2
3
Worker* w=new Worker("Jack", 1000);
workers.push_back(w);
workers.push_back(w);
Добавлено через 2 минуты
Вообще для таких дел существуют не std-лисапеты а концепция под названием "списки владения"
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 17:57
Цитата Сообщение от Operok Посмотреть сообщение
кто будет "освобождать" несчастного Worker'а?
если воркер не смог аллоцироваться и построиццо, то это гемморой new.
если из конструктора вылетит птичка,
new сделает откат выделенной памяти.

если же успел - теперь это гемморой std::vector.

Цитата Сообщение от Operok Посмотреть сообщение
объект создан, а вот push_back не смог, стандарт гарантирует что сам вектор в этом случае останется нетронутым, но объект лежит в куче - memory leak
что за бред?

ещё раз: объект построился, теперь это - гемморой std::vector.
вектор без вас разберется что ему делать со своим push_back,
и своими ресурсами.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.08.2016, 18:19
Цитата Сообщение от Operok Посмотреть сообщение
вот push_back не смог, стандарт гарантирует что сам вектор в этом случае останется нетронутым, но объект лежит в куче - memory leak
это уже не leak это out of heap
1
4 / 4 / 1
Регистрация: 17.12.2015
Сообщений: 119
17.08.2016, 18:32  [ТС]
Всё таки остановился на unique_ptr. Спасибо всем
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.08.2016, 18:34
Цитата Сообщение от hoggy Посмотреть сообщение
что за бред?
C++
1
2
3
4
5
6
try {
    workers.push_back(new Worker(...));
}
catch (...) {
    //если исключение брошено после успешного выполнения new, то memory leak
}
такой вот бред. Всё равно что:
C++
1
2
3
4
5
6
7
try {
    Worker* new_w = new Worker(...);
    workers.push_back(new_w);
}
catch (...) {
    //аналогично
}
Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
если же успел - теперь это гемморой std::vector.
вектор не выполнил push_back, он вообще не при делах теперь
0
4 / 4 / 1
Регистрация: 17.12.2015
Сообщений: 119
17.08.2016, 18:36  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
тут же все просто, мы берем в цикле каждый элемент списка workers, который попадает в переменную it, и освобождаем память через delete it;
То есть конструкция for(auto& it : worker) пробегается по каждому элементу вектора? Синтаксис необычный, я такого не встречал. Это работает только с векторами?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.08.2016, 18:37
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ну можно и так например:
это называется "выстрелить себе в ногу, осознавая что стреляешь себе в ногу"
И опять не "скопмлится", этот конструктор unique_ptr explicit
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 18:54
Цитата Сообщение от Operok Посмотреть сообщение
такой вот бред. Всё равно что:
ну это реальный бред.
почитайте ещё раз про гарантии, которые дает push_back
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.08.2016, 19:00
Цитата Сообщение от hoggy Посмотреть сообщение
почитайте ещё раз про гарантии, которые дает push_back
Даются гарантии что вектор останется в неизменном состоянии в случае исключения (которые произошло внутри вызова push_back, а new Worker(...) - выполняет до). Именно так, указатель на новый Worker "канет в Лету" а вектор останется таким, как и был прежде.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 19:11
Цитата Сообщение от Operok Посмотреть сообщение
указатель на новый Worker "канет в Лету"
твою ж заногу...

ладно. ок.
давайте так: попробуйте смоделировать ситуацию с утечкой памяти.

может быть тогда до вас допрет,
что по вине вектора этого произойти никак не может.

и если вы вдруг не в курсе:
указатель останется без изменений,
если new провалилась.
и вся запрошенная под объект память будет благополучно возвращена.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.08.2016, 19:28
Цитата Сообщение от hoggy Посмотреть сообщение
давайте так: попробуйте смоделировать ситуацию с утечкой памяти.
Майерс, "Эффективное использование с++", Правило 48. Почти об этом.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
17.08.2016, 20:06
Цитата Сообщение от hoggy Посмотреть сообщение
что по вине вектора этого произойти никак не может.
Вины вектора тут нет, виноват программист.
Цитата Сообщение от hoggy Посмотреть сообщение
попробуйте смоделировать ситуацию с утечкой памяти.
Вектору просто дали указатель, ему понадобилось ресайзиться, а тут bad_alloc, мы его перехватываем (и скорее всего останавливаем приложение, но не в этом суть), а указатель потерян. Оператор new вызван без ведома вектора, ему наплевать как мы получили указатель на Worker, однако если не предусмотреть в catch блоке освобождение, то будет memory leak.
Для справки: этот код
Цитата Сообщение от Operok Посмотреть сообщение
подсказка
, позволяет этого избежать, но зачем так извращаться ели есть вектор смарт поинтеров.

Добавлено через 5 минут
Цитата Сообщение от hoggy Посмотреть сообщение
если new провалилась.
не провалилось
Цитата Сообщение от Operok Посмотреть сообщение
//если исключение брошено после успешного выполнения new, то memory leak
Цитата Сообщение от Operok Посмотреть сообщение
в куче создаётся новый Worker (new Worker(...)),
Цитата Сообщение от Operok Посмотреть сообщение
operator new своё дело сделал, объект создан
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 21:13
Цитата Сообщение от Operok Посмотреть сообщение
Вины вектора тут нет, виноват программист.
в отношении push_back - это бред.
поскольку утечки памяти под аллоцируемый объект в принципе случится не сможет.

Цитата Сообщение от Operok Посмотреть сообщение
Вектору просто дали указатель, ему понадобилось ресайзиться
под "смоделировать" я предполагал - продемонстрировать утечку кодом.
ваши голословные бла бла бла нисколько не интересны.
после безуспешной попытки смоделировать ситуацию на практике,
мы сможете понять глубину своего заблуждения.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.08.2016, 21:18
Цитата Сообщение от Operok Посмотреть сообщение
это называется "выстрелить себе в ногу, осознавая что стреляешь себе в ногу"
C++
1
2
3
Worker* w=new Worker("Jack", 1000);
workers.push_back(w);
delete w;
Список же владения и двойного добавления не допустит на автомате и внешнее удаление прекрасно обработает с извлечением указателя из списка.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 21:26
Цитата Сообщение от Operok Посмотреть сообщение
Вины вектора тут нет, виноват программист.
в отношении push_back - это бред.
поскольку утечки памяти под аллоцируемый объект в принципе случится не сможет.

Цитата Сообщение от Operok Посмотреть сообщение
Вектору просто дали указатель, ему понадобилось ресайзиться
под "смоделировать" я предполагал - продемонстрировать утечку кодом.
ваши голословные бла бла бла нисколько не интересны.
после безуспешной попытки смоделировать ситуацию на практике,
мы сможете понять глубину своего заблуждения.


Цитата Сообщение от Operok Посмотреть сообщение
не провалилось
тогда вектор либо успешно вставит элемент
либо успешно откатит всю операцию взад.

у вас в принципе не получится смоделировать ситуацию при которой,
память под вставляемый объект утечет.

Добавлено через 4 минуты
Цитата Сообщение от avgoor Посмотреть сообщение
Майерс, "Эффективное использование с++", Правило 48. Почти об этом.
Правило 48: Изучите метапрограммирование шаблонов
вообще не об этом.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
17.08.2016, 21:31
Цитата Сообщение от hoggy Посмотреть сообщение
у вас в принципе не получится смоделировать ситуацию при которой,
память под вставляемый объект утечет.
Ты говоришь вообще про С++, или про какую-то "архитектуру" в частности?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.08.2016, 21:32
Цитата Сообщение от Nosey Посмотреть сообщение
Ты говоришь вообще про С++, или про какую-то "архитектуру" в частности?
C++
1
std::vector::push_back
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.08.2016, 21:32

Vector string'ов и освобождение памяти
Как известно вектор не освобождает память. В подавляющем большинстве случаев string работает на основе вектора (т.к. если использовать...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Поменять make и release так, чтобы организовать правильное уничтожение объектов и освобождение памяти
Имеем код: #include &lt;iostream&gt; struct Base { public: ~Base() { std::cout &lt;&lt; &quot;Base::~Base&quot; &lt;&lt; std::endl; } ...

Представление памяти std::vector
Добрый день! Вопрос по вектору, из его описание следует, что он располагает свои элементы линейно до тех пор пока это возможно, а в случае...

std::vector Перераспределение памяти
Код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;tchar.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru