Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
#1

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

06.12.2012, 14:39. Просмотров 597. Ответов 8

Либо я себе мозг запудрила, либо помогите мне
есть у меня вектор
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 так и осталась висеть в памяти..

Это получается, если есть вектор указателей, он не освобождает память? Или нужно это делать как-то по-другому? Или я вообще лабуду наделала?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 14:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Утечка памяти (C++):

Утечка памяти
Привет! написал программму, и не могу разобраться где утекает память. помогите...

утечка памяти
если запустить код char *pointer = NULL; for( int i = 0; i &lt; 10; i++ ) {...

Утечка памяти
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня...

Утечка памяти?
В Лафоре такой код: #include &lt;iostream&gt; using namespace std;...

утечка памяти
Может кто-то проверить есть ли здесь утечка памяти? Мне почему-то кажется что...

Утечка памяти
Доброго времени суток. Написал оконное приложение. Столкнулся с проблемой -...

8
Croessmah
++Ͻ
14162 / 8087 / 1513
Регистрация: 27.09.2012
Сообщений: 19,930
Записей в блоге: 3
Завершенные тесты: 1
06.12.2012, 14:42 #2
Цитата Сообщение от Leomana Посмотреть сообщение
Это получается, если есть вектор указателей, он не освобождает память?
Вектор подчищает за собой, но не за Вами. Если Вы записываете в него указатели на выделенную в куче память, то потом Вам же её и удалять.
Память, выделенную для указателей он освободит, а вот то, что находится по этим указателям - Ваша головная боль.
0
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 14:45  [ТС] #3
ну если вектор у меня глобальный, а указатель s локальный.. то как мне поместить строку s, удалить ее, но при этом чтобы в векторе осталось строка?
0
Croessmah
++Ͻ
14162 / 8087 / 1513
Регистрация: 27.09.2012
Сообщений: 19,930
Записей в блоге: 3
Завершенные тесты: 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;
}
0
prazuber
110 / 110 / 13
Регистрация: 29.04.2010
Сообщений: 240
06.12.2012, 14:54 #5
Сама конструкция плоха. Вы уверены, что вам нужен именно std::vector<char*>? В большинстве случаев std::vector<std::string> замечательно подойдет, и никаких утечек памяти не будет.
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
06.12.2012, 14:58 #6
Или пользутесь умными указателями, если есть возможность.

Добавлено через 1 минуту
(Только не auto_ptr).
0
Leomana
59 / 59 / 8
Регистрация: 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 не удаляется...
0
Croessmah
++Ͻ
14162 / 8087 / 1513
Регистрация: 27.09.2012
Сообщений: 19,930
Записей в блоге: 3
Завершенные тесты: 1
06.12.2012, 15:04 #8
Цитата Сообщение от Leomana Посмотреть сообщение
ну так в Вашем коде p не удаляется...
Вот именно! И операция v.pop_back() тоже не освобождает память, выделенную для строки.
0
Leomana
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
06.12.2012, 15:09  [ТС] #9
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Сама конструкция плоха. Вы уверены, что вам нужен именно std::vector<char*>? В большинстве случаев std::vector<std::string> замечательно подойдет, и никаких утечек памяти не будет.
к сожалению сначала не задалось со string по глупости, и теперь вся программа состоит из char*... и переделывать нет резона)
0
06.12.2012, 15:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 15:09
Привет! Вот еще темы с решениями:

Утечка памяти
Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно -...

Утечка памяти
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не...

утечка памяти
доброго времени суток Уважаемые форумчане, помогите пожалуйста разобраться с...

Утечка памяти
Здравствуйте! Я пишу длинную арифметику для целых чисел. Ниже - функция...


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

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

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