Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637

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

13.09.2017, 16:34. Показов 2608. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Подскажите пожалуйста в этом коде будет ведь утечка памяти?

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
// Create the outer JSON object which parents the others.
  TJSONObject *o = new TJSONObject();
  __try {
        // Create the books object, which contains the array of books...
        TJSONArray *a = new TJSONArray();
 
        // add the array to the object.
        o->AddPair("books",a);
 
        // Create the first book
        TJSONObject *book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Zen") );
        book->AddPair( new TJSONPair("subtitle","and The art of motorcycle maintenance.") );
        book->AddPair( new TJSONPair("author","Robert M Pirsig") );
        book->AddPair( new TJSONPair("isbn","9780061908019") );
        // Add the book to the array
        a->AddElement(book);
 
        // Create the second book
        book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Coding in Delphi") );
        book->AddPair( new TJSONPair("subtitle","") );
        book->AddPair( new TJSONPair("author","Nick Hodges") );
        book->AddPair( new TJSONPair("isbn","978-1941266038") );
        // Add the book to the array
        a->AddElement(book);
    }
  __finally
    {
      Memo1->Lines->Text = o->ToString();
      o->Free();
    }
И как можно избавиться от неё?

Прописывал
C++
1
2
book delete ;
a delete;
Но при выполнение программы, произошел вылет программы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2017, 16:34
Ответы с готовыми решениями:

Утечка памяти
Здравствуйте. Есть функция void fun(...) { TStringList *L = new TStringList(); ... ... delete L; }

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

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

17
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,140
Записей в блоге: 3
13.09.2017, 18:02
а не надо менять местами ?
C++
1
2
delete book ;
delete a ;
book у Вас обновляется дважды, его каждый раз нужно удалять и пересоздавать (это если по простому)


А еще можно применить

C++
1
#include <memory>
с его std::auto_ptr<>
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.09.2017, 19:22  [ТС]
Цитата Сообщение от Dinkin Посмотреть сообщение
А еще можно применить
Пытаюсь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   std::auto_ptr<TJSONObject> glafn(new TJSONObject ());
   TJSONArray *Jarr = new TJSONArray();
   glafn->AddPair(new TJSONPair("books",(TJSONArray*)Jarr));
 
 
 
   for(int i=0; i<500; i++)
   {
      std::auto_ptr<TJSONObject> myfor(new TJSONObject ());
      myfor->AddPair("size", i);
      myfor->AddPair("title","Zen") ;
      myfor->AddPair("subtitle","and The art of motorcycle maintenance.");
      myfor->AddPair("author","Robert M Pirsig");
      myfor->AddPair("isbn",i);
 
      Jarr->AddElement((TJSONObject*)myfor) ;//здесь ошибка E2031 Cannot cast from 'std::auto_ptr<TJSONObject>' to 'TJSONObject *'
    }
 
}
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
13.09.2017, 19:39
Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::auto_ptr<TJSONObject> glafn(new TJSONObject ());
   std::auto_ptr <TJSONArray> Jarr (new TJSONArray());
   glafn->AddPair(new TJSONPair("books", Jarr.get()));
 
 
 
   for(int i=0; i<500; i++)
   {
      std::auto_ptr<TJSONObject> myfor(new TJSONObject ());
      myfor->AddPair("size", i);
      myfor->AddPair("title","Zen") ;
      myfor->AddPair("subtitle","and The art of motorcycle maintenance.");
      myfor->AddPair("author","Robert M Pirsig");
      myfor->AddPair("isbn",i);
 
      Jarr->AddElement(myfor.get()) ;
    }
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.09.2017, 20:43  [ТС]
При исполнение выдаёт ошибку abdormal что то такое.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
15.09.2017, 20:22  [ТС]
Кастыль но решение. Что можете ещё посоветовать.
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
std::auto_ptr<TJSONObject> glafn(new TJSONObject ());
   TJSONArray *Jarr =new TJSONArray();
 
   TStringList *lis= new TStringList();
 
   TJSONObject * myfor[12];
 
 
   for(int i=0; i<12; i++)
   {
       myfor[i]= new TJSONObject ();
 
       myfor[i]->AddPair("usize", i);
       myfor[i]->AddPair("title","c:\\users\\alex\\documents\\projectwin\\project\\aitotal_ver[v3.3.14]-04-03-2017\\aitotal\\release\\aitotal\\aitotaltmp\\archiw\\hidemywp-553.rar_2017.09.15_13-47-22\\codecanyon-4177158-hide-my-wp-amazing-security-plugin-for-wordpress\\documentation\\assets\\.ds_store") ;
       myfor[i]->AddPair("subtitle","and The art of motorcycle maintenance.");
       myfor[i]->AddPair("author","Robert M Pirsig");
       myfor[i]->AddPair("isbn",i);
 
       Jarr->AddElement(myfor[i]);
   }
 
   lis->Add(Jarr->ToJSON());
   lis->SaveToFile("Jarr");
   lis->Clear();
 
   glafn->AddPair("books",Jarr);
   lis->Add(glafn->ToJSON());
   lis->SaveToFile("aqws");
 
   delete   [] myfor;//Здесь я правильно применяю удаление?
   delete lis;
   delete Jarr;
Добавлено через 49 минут
Что то не правильно. При выполнение кода
C++
1
delete   [] myfor;//Здесь я правильно применяю удаление?
программа зависает.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
15.09.2017, 22:39
Цитата Сообщение от Dr.Xank Посмотреть сообщение
C++
1
delete * [] myfor;//Здесь я правильно применяю удаление?
Неправильно. В случае Вашего кода надо делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for(int i=0; i<12; i++)
   {
       myfor[i]= new TJSONObject ();
 
       myfor[i]->AddPair("usize", i);
       myfor[i]->AddPair("title","c:\\users\\alex\\documents\\projectwin\\project\\aitotal_ver[v3.3.14]-04-03-2017\\aitotal\\release\\aitotal\\aitotaltmp\\archiw\\hidemywp-553.rar_2017.09.15_13-47-22\\codecanyon-4177158-hide-my-wp-amazing-security-plugin-for-wordpress\\documentation\\assets\\.ds_store") ;
       myfor[i]->AddPair("subtitle","and The art of motorcycle maintenance.");
       myfor[i]->AddPair("author","Robert M Pirsig");
       myfor[i]->AddPair("isbn",i);
 
       Jarr->AddElement(myfor[i]);
       delete myfor[i]; /* Освобождаем память сразу для каждого указателя */
   }
 
// Либо так:
lis->SaveToFile("aqws");
 
   for(int i = 0; i < 12; i++) delete myfor[i]; /* Либо освобождаем потом для всех указателей по очереди */
   delete lis;
1
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
16.09.2017, 16:14  [ТС]
А вот моё решение)) утечки нету)))
Delphi
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
procedure probaListView(ListView1 :TListView);
 var JSONObject, InnerObject : TJSONObject;
    //Pair : TJSONPair;
    JsonArray: TJSONArray;
    S:TStringList;
    I : integer;
begin
    JSONObject:=TJSONObject.Create;
    JsonArray :=TJSONArray.Create;
    S:=TStringList.Create;
 
    for I :=0 to ListView1.Items.Count-1 do
    begin
      InnerObject:=TJSONObject.Create;
      InnerObject.AddPair('namefile',ListView1.Items[I].SubItems.Strings[0]);
      InnerObject.AddPair('filesize',ListView1.Items[I].SubItems.Strings[1]);
      InnerObject.AddPair('md5',ListView1.Items[I].SubItems.Strings[2]);
      InnerObject.AddPair('sha256',ListView1.Items[I].SubItems.Strings[3]);
      JsonArray.AddElement(InnerObject);
 
    end;
    JSONObject.AddPair('tablica1',JsonArray);
 
    S.Add(JSONObject.ToJSON);
    s.SaveToFile('jsson.txt');
 
    s.Destroy;
    JSONObject.Destroy;
end;
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.09.2017, 12:07
В delphi не хорошо вызывать Destroy напрямую, есть Free a еще лучше FreeAndNil()

Касательно удаления в json, там вроде права владения дочерний-родитель, поэтому достаточно удалять родительский элемент.
1
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
17.09.2017, 20:51  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Касательно удаления в json, там вроде права владения дочерний-родитель, поэтому достаточно удалять родительский элемент.
Это относится и на С++?
А то как я знаю, если создал указатель, но его надо и удалять.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.09.2017, 21:26
Цитата Сообщение от Dr.Xank Посмотреть сообщение
Это относится и на С++?
А то как я знаю, если создал указатель, но его надо и удалять.
Это касается архитектуры этих классов.

Добавлено через 2 минуты
Dr.Xank, да и в вашем коде на делфи будет утечка памяти в случае если произойдет исключение, например
при не возможности сохранить файл
Delphi
1
s.SaveToFile('jsson.txt');
1
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
18.09.2017, 00:03  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Это касается архитектуры этих классов.
Это выходит, что сдесь нет утечки.
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
// Create the outer JSON object which parents the others.
  TJSONObject *o = new TJSONObject();
  __try {
        // Create the books object, which contains the array of books...
        TJSONArray *a = new TJSONArray();
 
        // add the array to the object.
        o->AddPair("books",a);
 
        // Create the first book
        TJSONObject *book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Zen") );
        book->AddPair( new TJSONPair("subtitle","and The art of motorcycle maintenance.") );
        book->AddPair( new TJSONPair("author","Robert M Pirsig") );
        book->AddPair( new TJSONPair("isbn","9780061908019") );
        // Add the book to the array
        a->AddElement(book);
 
        // Create the second book
        book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Coding in Delphi") );
        book->AddPair( new TJSONPair("subtitle","") );
        book->AddPair( new TJSONPair("author","Nick Hodges") );
        book->AddPair( new TJSONPair("isbn","978-1941266038") );
        // Add the book to the array
        a->AddElement(book);
    }
  __finally
    {
      Memo1->Lines->Text = o->ToString();
      delete  o;// Удаляю родителя и всё, утечки нет.
    }
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
18.09.2017, 07:02
Может скажу что-то не то, но я не вижу, что Вы назначаете родителем объектов a, book объект o. Кроме этого, для объекта book память выделяется 2 раза и первая из них явно не удалится при удалении o.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
18.09.2017, 14:23  [ТС]
Код на Дельфи написан также, но утечки нет. Там тоже JSONObject, InnerObject, JsonArray.
Как я понимаю, если один объект передаётся другому, то он становится дочерним, и в самой реализации класс Jsson идёт освобождение памяти и его удаление.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2017, 14:41

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от Dr.Xank Посмотреть сообщение
Код на Дельфи написан также, но утечки нет.
Там нет try/finally
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
18.09.2017, 16:50  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если не доходит прочитайте мои посты еще раз, ничего другого не могу сказать ибо и так предельно ясно выразился.
Я уточняю, правильно я понял, что здесь не будет утечки.
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
// Create the outer JSON object which parents the others.
  TJSONObject *o = new TJSONObject();
  __try {
        // Create the books object, which contains the array of books...
        TJSONArray *a = new TJSONArray();
 
        // add the array to the object.
        o->AddPair("books",a);
 
        // Create the first book
        TJSONObject *book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Zen") );
        book->AddPair( new TJSONPair("subtitle","and The art of motorcycle maintenance.") );
        book->AddPair( new TJSONPair("author","Robert M Pirsig") );
        book->AddPair( new TJSONPair("isbn","9780061908019") );
        // Add the book to the array
        a->AddElement(book);
 
        // Create the second book
        book = new TJSONObject();
        book->AddPair( new TJSONPair("title","Coding in Delphi") );
        book->AddPair( new TJSONPair("subtitle","") );
        book->AddPair( new TJSONPair("author","Nick Hodges") );
        book->AddPair( new TJSONPair("isbn","978-1941266038") );
        // Add the book to the array
        a->AddElement(book);
    }
  __finally
    {
      Memo1->Lines->Text = o->ToString();
      delete  o;// Удаляю родителя и всё, утечки нет.
    }
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2017, 17:17
Цитата Сообщение от Dr.Xank Посмотреть сообщение
Я уточняю, правильно я понял, что здесь не будет утечки.
А попробовать и самому выяснить?
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
18.09.2017, 17:45  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А попробовать и самому выяснить?
На С++ я не знаю как это сделать, на дельфи просто ReportMemoryLeaksOnShutdown:=true;

Искал но всё время находил для дельфи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2017, 17:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru