Форум программистов, компьютерный форум CyberForum.ru

Утечка памяти - C++

Восстановить пароль Регистрация
 
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 14:39     Утечка памяти #1
Либо я себе мозг запудрила, либо помогите мне
есть у меня вектор
C++
1
vector<char*> names_variable;
дополняю его таким образом
C++
1
2
3
4
char* s = new char[11];
s[10] = '\0';
// код ...
names_variable.push_back(s);
и при этом не удаляю указатель s .. ибо в векторе останется пусто
удаляю вектор
C++
1
names_variable.clear();
но как выясняется память того, что содержалось в s так и осталась висеть в памяти..

Это получается, если есть вектор указателей, он не освобождает память? Или нужно это делать как-то по-другому? Или я вообще лабуду наделала?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 14:39     Утечка памяти
Посмотрите здесь:

C++ Утечка памяти
Утечка памяти?! C++
C++ Утечка памяти
Утечка памяти C++
утечка памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.12.2012, 14:42     Утечка памяти #2
Цитата Сообщение от Leomana Посмотреть сообщение
Это получается, если есть вектор указателей, он не освобождает память?
Вектор подчищает за собой, но не за Вами. Если Вы записываете в него указатели на выделенную в куче память, то потом Вам же её и удалять.
Память, выделенную для указателей он освободит, а вот то, что находится по этим указателям - Ваша головная боль.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 14:45  [ТС]     Утечка памяти #3
ну если вектор у меня глобальный, а указатель s локальный.. то как мне поместить строку s, удалить ее, но при этом чтобы в векторе осталось строка?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.12.2012, 14:53     Утечка памяти #4
Цитата Сообщение от Leomana Посмотреть сообщение
ну если вектор у меня глобальный, а указатель s локальный.. то как мне поместить строку s, удалить ее, но при этом чтобы в векторе осталось строка?
Выделяйте память под строку в динамической памяти, потом копию указателя на эту память записывайте в вектор. Перед удалением элемента вектора, освобождайте память, выделенную для строки. При удалении всего вектора - проходите по всем элементам и освобождайте память.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
std::vector<char*> v;
int main()
{
    
    while(true){
        char *p=new char[1024];
        v.push_back(p);
        //delete [] v[0]; //Без этого, память быстро кончится и программа "упадет"
        v.pop_back();
    }
    return 0;
}
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
06.12.2012, 14:54     Утечка памяти #5
Сама конструкция плоха. Вы уверены, что вам нужен именно std::vector<char*>? В большинстве случаев std::vector<std::string> замечательно подойдет, и никаких утечек памяти не будет.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.12.2012, 14:58     Утечка памяти #6
Или пользутесь умными указателями, если есть возможность.

Добавлено через 1 минуту
(Только не auto_ptr).
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 15:00  [ТС]     Утечка памяти #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Выделяйте память под строку в динамической памяти, потом копию указателя на эту память записывайте в вектор. Перед удалением элемента вектора, освобождайте память, выделенную для строки. При удалении всего вектора - проходите по всем элементам и освобождайте память.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
std::vector<char*> v;
int main()
{
    
    while(true){
        char *p=new char[1024];
        v.push_back(p);
        //delete [] v[0]; //Без этого, память быстро кончится и программа "упадет"
        v.pop_back();
    }
    return 0;
}
ну так в Вашем коде p не удаляется...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.12.2012, 15:04     Утечка памяти #8
Цитата Сообщение от Leomana Посмотреть сообщение
ну так в Вашем коде p не удаляется...
Вот именно! И операция v.pop_back() тоже не освобождает память, выделенную для строки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 15:09     Утечка памяти
Еще ссылки по теме:

Утечка памяти C++
C++ утечка памяти
C++ Утечка памяти

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

Или воспользуйтесь поиском по форуму:
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 15:09  [ТС]     Утечка памяти #9
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Сама конструкция плоха. Вы уверены, что вам нужен именно std::vector<char*>? В большинстве случаев std::vector<std::string> замечательно подойдет, и никаких утечек памяти не будет.
к сожалению сначала не задалось со string по глупости, и теперь вся программа состоит из char*... и переделывать нет резона)
Yandex
Объявления
06.12.2012, 15:09     Утечка памяти
Ответ Создать тему

Метки
памяти, утечка
Опции темы

Текущее время: 00:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru