Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Утечка памяти

28.07.2016, 16:43. Показов 2424. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть функция
C++
1
2
3
4
5
6
7
void fun(...)
{
   TStringList *L = new TStringList();
   ...
   ...
   delete L;
}
Если не делать L->Clear(); перед удалением, то память утекает. Разве delete не должно брать очистку на себя?


И ещё одна функция(с использованием RegExpr)
C++
1
2
3
4
5
6
7
8
9
10
11
12
void fun2(TRegExpr *Reg, ...)
{
   if(Reg != NULL)
   {
       Reg->Expression = "шаблон";
       Reg->Compile();
       if(Reg->Exec(Template->Text))
       {    
           //что-то делаем
       } 
   }
}
В данном случае, если не делать
C++
1
2
Reg->InputString = "";
Reg->Expression = "";
память так же утекает.
Но, я думаю, в RegExpr есть еще что-то, что можно было бы очистить, только я не знаю что именно.
Буду очень рад за пояснения.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.07.2016, 16:43
Ответы с готовыми решениями:

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

Утечка памяти
Подскажите, где происходит утечка памяти? Размер используемой памяти постоянно растет. + Как можно ускорить работу, очень медленно...

Утечка памяти
Всем привет. Подскажите пожалуйста в этом коде будет ведь утечка памяти? // Create the outer JSON object which parents the others. ...

17
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
28.07.2016, 16:45
Как определили, что память утекает?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
28.07.2016, 17:09
Цитата Сообщение от Gdasar Посмотреть сообщение
Разве delete не должно брать очистку на себя?
Нет, если в список добавлялись строки и объекты, и при этом свойство OwnsObject не было выставлено в true.
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
28.07.2016, 17:43
Для анализа, что в Clear и Destroy
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TStringList.Clear;
var
  I: Integer;
  Obj: TObject;
begin
  if FCount <> 0 then
  begin
    Changing;
 
    //Free all objects in the event that this list owns its objects
    if OwnsObjects then
    begin
      for I := 0 to FCount - 1 do
      begin
        Obj := GetObject(I);
        Obj.Free;
      end;
    end;
 
    Finalize(FList^[0], FCount);
    FCount := 0;
    SetCapacity(0);
    Changed;
  end;
end;
 
destructor TStringList.Destroy;
var
  I: Integer;
begin
  FOnChange := nil;
  FOnChanging := nil;
 
  // In the event that we own the Objects make sure to free them all when we
  // destroy the stringlist.
  if OwnsObjects then
  begin
    for I := 0 to FCount - 1 do
      GetObject(I).Free;
  end;
 
  inherited Destroy;
  if FCount <> 0 then Finalize(FList^[0], FCount);
  FCount := 0;
  SetCapacity(0);
end;
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
28.07.2016, 18:36  [ТС]
Ясно. А как быть со вторым вариантом?
У RegExpr я не нашел метода Clear. Без указанных строк память утекает.
Цитата Сообщение от d7d1cd Посмотреть сообщение
Как определили, что память утекает?
Смотрел диспетчер задач.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
28.07.2016, 18:53
Цитата Сообщение от Gdasar Посмотреть сообщение
Смотрел диспетчер задач


Тысячу раз сказано: это не показатель.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
28.07.2016, 19:10  [ТС]
volvo, много раз видел такие сообщения как Ваше.
Ну а чем тогда воспользоваться?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
28.07.2016, 19:22
Другим диспетчером (например, ProcessExplorer-ом), средствами для поиска утечек, встроенными в Билдер (типа CodeGuard), средствами статического анализа кода (по крайней мере раньше была возможность использовать PVS-Studio, не знаю, как сейчас у них дела с Билдером, но на них тоже асфальт не заканчивается), только не TaskManager-ом...
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
28.07.2016, 21:03  [ТС]
Посмотрел ProcessExplorer'м - память утекает. Про CodeGuard не писал, так как это первое, чем я воспользовался.
Про RegExpr я не просто так упомянул.
Без вот этих строчек:
C++
1
2
Reg->InputString = "";
Reg->Expression = "";
Памяти и правда расходуется больше.
Из-за чего это происходит я не знаю. Вот и спросил у более опытных людей, которые не одну собаку съели в этом деле.
Буду очень благодарен за Ваши размышления по этому поводу.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
28.07.2016, 21:34
Цитата Сообщение от Gdasar Посмотреть сообщение
память утекает
Рассказывай
1) что именно делается в функции fun()
2) как именно ты вызываешь ее.

Я попробовал в функции запихать в StringList полмиллиона строк, и потом просто жал на кнопку, которая вызывает эту функцию. И что? После первых двух раз потребление памяти чуть-чуть увеличилось, а потом жал еще раз 30 - никакого увеличения. Это при полумиллионе-то строк? Если бы она текла - ее бы вообще не осталось... Причем добавление Clear() ситуацию не меняет совершенно...

Аналогично и с fun2. Первые несколько раз память растет, потом останавливается.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
28.07.2016, 21:57  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Рассказывай
Утекает, но не так критично : с 8мб до 35-40мб.
Подробнее : есть один объект типа RegExpr, который используется как в главной программе, так и передается в функцию fun2(вызывается в цикле N раз). И, если вот эти строчки не писать
C++
1
2
Reg->InputString = "";
Reg->Expression = "";
расход памяти больше, чем с ними.
Вот я и хочу узнать, из-за чего это может происходить.

fun2 - делает замену текста в другом, более обширном тексте.
вызываю вот так:
C++
1
fun2(Reg);
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
29.07.2016, 07:51
Цитата Сообщение от volvo Посмотреть сообщение
Нет, если в список добавлялись строки и объекты, и при этом свойство OwnsObject не было выставлено в true.
А вот это для меня вообще новость !!! Я думал, что память, выделенная оператором new, можно освободить оператором delete. Из этого следует, что и при использовании умных указателей, память может остаться занятой. Верно, volvo?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.07.2016, 08:55
d7d1cd, неверно, причем здесь умные указатели?

У класса TStringList есть контейнер с элементами типа TObject, у которых есть функция Free(), при вызове которой освобождается память объекта.
To есть:
C++
1
2
TObject *AObj = new TObject;
AObj->Free(); // или delete AObj; память будет освобождена в обоих случаях
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
29.07.2016, 09:27
Maluda, давайте пока забудем про объекты. volvo говорил, что если в список добавлялись строки, то delete не освободит память.
C++
1
2
3
TStringList *list = new TStringList();
list->Add(L"New string");
delete list; // Как я понимаю, здесь освободится не вся память
Умные указатели здесь при том, что их использование как раз и нужно для упрощения работы с памятью. А точнее, чтобы не задумываться об освобождении памяти. Но в приведенном случае задумываться все равно нужно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
29.07.2016, 09:29
Цитата Сообщение от d7d1cd Посмотреть сообщение
Верно, volvo?
Абсолютно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A : public TObject
{
    int i;
public:
    __fastcall A() : TObject()
    {
        i = 100;
    }
    virtual __fastcall ~A()
    {
        i = 0; // Поставь сюда точку останова, запусти код и нажми кнопку
    }
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TStringList> Ls(new TStringList);
    // Ls->OwnsObjects = true;
    Ls->AddObject("Test", new A);
}
Дождался вызова деструктора объекта? А теперь раскомментируй строку с OwnsObjects = true, и запусти. Вот теперь утечки не будет, объект уничтожился...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.07.2016, 09:51
Цитата Сообщение от d7d1cd Посмотреть сообщение
C++
1
2
3
TStringList *list = new TStringList();
list->Add(L"New string");
delete list; // Как я понимаю, здесь освободится не вся память
Здесь ВСЁ ПРАВИЛЬНО ОСВОБОДИТСЯ!

Добавлено через 4 минуты
Цитата Сообщение от d7d1cd Посмотреть сообщение
volvo говорил, что если в список добавлялись строки, то delete не освободит память
delete не освободит память объектов, а не строк, если свойство OwnObjects выставлено в false. Я же специально привел код класса TStringList выше
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,856
Записей в блоге: 12
29.07.2016, 10:02
Maluda, тогда зачем было говорить, что утверждение
Цитата Сообщение от d7d1cd Посмотреть сообщение
Из этого следует, что и при использовании умных указателей, память может остаться занятой.
Цитата Сообщение от Maluda Посмотреть сообщение
d7d1cd, неверно
?
Память может остаться неосвобожденной при использовании "умных" указателей? Может. Всё остальное - вода...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
29.07.2016, 10:22
ну, если придираться к словам, тогда следует спросить память чего?
память "левого" объекта - да

память инкапсулируемого объекта (при стандартном поведении умного указателя, если вы не переопределили deleter - нет)

вопрос к вам, volvo

C++
1
std::auto_ptr<Object>AObject(new Object);
В каких случаях не удалится память объекта здесь?

В общем, чтобы расставить все точки над 'i'

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
    // верно
    TStringList *list = new TStringList();
    list->Add(L"New string");
    delete list;
}
 
{
    // верно
    std::auto_ptr<TStringList>list(new TStringList());
    list->Add(L"New string");
}
 
{
    // верно
    std::auto_ptr<TStringList>list(new TStringList());
    list->OwnsObjects = true;
    list->AddObject(L"New string", new TObject);
}
 
{
    // верно
    std::auto_ptr<TStringList>list(new TStringList());
    list->AddObject(L"New string", new TObject);
    list->Objects[0]->Free();
}
 
{
    // верно (особый пример для volvo)
    std::auto_ptr<TStringList>list(new TStringList());
    list->AddObject(L"New string", (TObject*)88888888);
}
 
{
    // НЕВЕРНО (утечка памяти)
    std::auto_ptr<TStringList>list(new TStringList());
    list->AddObject(L"New string", new TObject);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2016, 10:22
Помогаю со студенческими работами здесь

Утечка памяти CppWebBrowser
Всем здравствуйте У меня возникла проблема: Утечка памяти CppWebBrowser вот код IHTMLDocument2 *pHTMLDocument; ...

Утечка памяти в streambuf?
Итак есть программа, которая обязана постоянно работать, принимать данные по сети, отправлять в SQL и визуализировать. Логика такая: ...

Огромная утечка памяти в CppWebBrowser
Доброго времени суток. Открываю в компоненте CppWebBrowser 300 страниц подряд (URL разные) в итоге к концу работы программа набирается...

Утечка памяти при вызове функции
Здравствуйте. Объясните пожалуйста почему возникает утечка памяти при вызове функции get_msg_error. int get_msg_error( const...

Шаблоны STL & утечка памяти.
Доброе время суток. Имеются 2 класса: 1)TVoteServer 2)TVoteServers - класс коллекция TVoteServer Реализация следующая: ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru