Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 215
#1

Как освободить память после удаления объекта из вектора

08.05.2015, 18:28. Просмотров 2107. Ответов 68
Метки нет (Все метки)

Всем доброго времени суток. Никак не могу понять как освободить память, после удаления объекта из вектора...
C++
1
2
3
std::vector<TNetwork*> networks;
//конструктор
this->networks.push_back(new TNetwork(typeNetwork, name));
в TNetwork тем же макаром создаются другие динамические объекты
уже как только не пытался удалить элемент из networks, но память все равно не освобождается...
C++
1
2
3
    delete this->networks[deleteNo];
    this->networks.erase(this->networks.begin() + deleteNo);
    std::vector<TNetwork*>(networks).swap(networks);
Подскажите плиз, что я делаю не так Может примерчик какой или мой поправить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2015, 18:28
Ответы с готовыми решениями:

Как освободить память из-под вектора объектов?
vector&lt;TObj*&gt; obj; obj.push_back(new obj());...

Освободить память вектора векторов без swap
Собственно будет ли &quot;Swap-To-Fit&quot; std::vector&lt;std::vector&lt;double&gt;&gt;...

Как правильно освободить память после работы с динамическим массивом
Здравствуйте! Помогите понять в чём проблема при освобождении памяти. Простой...

Как освободить память?
подскажите как правильно освободить память,спасибо заранее))) #include...

Как правильно освободить память
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под...

68
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 18:32 #2
C++
1
2
delete networks[deleteNo];
networks.erase(networks.begin() + deleteNo)
У тебя неправильный подход. Вектор должен содержать объекты, а не указатели. Тогда и удаление будет само работать.
3
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 215
08.05.2015, 18:35  [ТС] #3
nmcf, а по указателю можно очистить ? уже очень много сделано чтобы переписывать
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 18:36 #4
Ну я же показал как по указателю.
Если delete отработал, значит удалилось. Как ты определяешь, что память не освобождается?
0
DrOffset
8007 / 4646 / 1129
Регистрация: 30.01.2014
Сообщений: 7,551
08.05.2015, 18:38 #5
Цитата Сообщение от Fobes Посмотреть сообщение
но память все равно не освобождается
С чего ты решил, что она не освобождается?
Проверял инструментом контроля утечек, или что?
0
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
08.05.2015, 18:52 #6
И если оптом удалять, так чуть приличней.
C++
1
2
3
4
5
6
for (auto& network : networks)
{    
    delete network;
    network = nullptr;
}
networks.erase(std::remove(networks.begin(),networks.end(),nullptr),networks.end());
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
08.05.2015, 18:57 #7
Цитата Сообщение от nmcf Посмотреть сообщение
Вектор должен содержать объекты, а не указатели
подозреваю, что никому он ничего не должен
1
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 19:10 #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
подозреваю, что никому он ничего не должен
Подозреваю, что концептуально ему следует.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
08.05.2015, 19:19 #9
подозреваю, что в 80% он пришёл на замену СИшным массивам, и только на 20% тот факт, что это стековый объект и он в процессе выхода с области видимости убивает себя и вызывает деструкторы для своего шаблонного типа, что он инкапсулирует - подталкивает использовать это.

Так, что говорить о том, что контейнер вектор пришёл как СИшный массив умных указателей смешно. 80% он нужен как массив и в 20% остальное.

Как-то так.
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 19:21 #10
Ну ты завернул. Я имел в виду, что правильнее хранить объект, потому что при удалении его из вектора он уничтожится автоматически через деструктор.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
08.05.2015, 19:26 #11
я просто не нахожу слово "правильнее" тут. Я просто в 95% случаях храню как раз таки указатель - сортировка быстрее, поиск, копирование вектора, удалённое создание элеммента в вектор (возврат указателя с функции).

*грустный смайлик потому, что меня пытаются убедить, что я неправильно использую вектор*
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 19:33 #12
Сортировка, может, и быстрее. А вот как поиск быстрее стал и тем более копирование вектора, которое потребует вызывать выделение памяти под каждый элемент?
Возвращать из функции можно и объект, разницы нет.
Может, тебе просто вектор не подходит? Есть list - все элементы отдельно хранятся.
0
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
08.05.2015, 19:44 #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я просто не нахожу слово "правильнее" тут. Я просто в 95% случаях храню как раз таки указатель - сортировка быстрее, поиск, копирование вектора, удалённое создание элеммента в вектор (возврат указателя с функции).
Сортировка быстрее, да, но усиленная работа с вектором медленее из-за кешпромахов.
Поиск опять же не всегда быстрее - кешпромахи vs оператор сравнения.
Копирование вектора быстрее, но стоит отметить что тут идеологически совершенно другая история(копирование объектов и указателей на них)
"удалённое создание элеммента в вектор" - а вот это на мой взгляд главная фича хранения указателей в векторе, точнее не владеющее хранение.

Это я так пару копеек от себя вставил, а в общем я тоже против идеи:
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя неправильный подход. Вектор должен содержать объекты, а не указатели. Тогда и удаление будет само работать.
Всё нужно в меру
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
08.05.2015, 20:14 #14
Цитата Сообщение от Nosey Посмотреть сообщение
в общем я тоже
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
08.05.2015, 20:18 #15
Цитата Сообщение от Nosey Посмотреть сообщение
"удалённое создание элеммента в вектор" - а вот это на мой взгляд главная фича хранения указателей в векторе, точнее не владеющее хранение.
В чём тут плюс?
0
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
08.05.2015, 20:23 #16
Цитата Сообщение от nmcf Посмотреть сообщение
В чём тут плюс?
Я не сказал плюс я сказал "фича"
Ну и "плюс" в том что владеет кто-то другой, архитектура всякая нужна.
В ярый пример можно компоновщик привести. Да можно юзать умные указатели, а можно и без них.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2015, 20:39 #17
На счет использования "сырых" указателей в современном C++ моё мнение такое, что его надо сводить к минимуму. Т.е. оставлять только в тех местах, где без этого не обойтись. Во всех остальных случаях отдавать предпочтение умным указателям (std::unique_ptr, std::shared_ptr). Если код содержит явный вызов delete вне деструктора (а иногда и в нем тоже), то скорее всего он требует рефакторинга.

Т.о. в исходной задаче ТС тоже было бы правильным использовать один из типов умных указателей, имхо.
0
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
08.05.2015, 20:51 #18
Tulosba, Я ещё в этот список хочу добавить intrusive_ptr, либо свой велосипедик маленький, ибо далеко не всегда требуется потокобезопасность, а оверхед таки есть, особенно при постоянном использовании умных указателей.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2015, 21:02 #19
Цитата Сообщение от Nosey Посмотреть сообщение
а оверхед таки есть
Насколько я знаю, в std::unique_ptr оверхеда нет (при дефолтовой функции удаления). std::shared_ptr, конечно, другое дело.
Boost тоже хорошо, но пока не стандарт.
0
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 215
08.05.2015, 22:41  [ТС] #20
nmcf, DrOffset, пишу конструкторй нейросетей)) создал 10000 нейронов и несколько слоев, получил полтора гига оперативы в диспетчере... удалил сеть, в диспетчере ничего не поменялось) создал еще одну такую ще, получил что оперативка кончилась )

Добавлено через 7 минут
Nosey, оптом не нужно)) сетей может быть создано много... нужно удалить 1 элемент) не подскажите как это сделать. и желательно бы без с++ 11))
0
08.05.2015, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2015, 22:41

Как освободить память быстро?
Функция malloc неправильно работает...Заполняется память быстро,а очищается...

Как правильно освободить память
Написал вот такой костыль: wchar_t* getDate() { time_t seconds =...

Как правильно освободить память
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru