LINUX.ORG.RU

c++ правильная очистка памяти


0

2

Допустим есть структура, в которой лежат указатели на другие объекты, обычные переменные типа int, есть там QString. еще вектор, массив и много всячины еще. Как без замораживания очистить память этой структуры, например

.......................
class MyMegaStructure
{
public:
   int i;
   float j;
   vector <structure1*> structs;
   QString str;
   QStringList sl;
   int ar[128];
   structure2* ar2[256];

.......................

};

MyMegaStructure *strc = new MyMegaStructure();
strc->Load();
.......................
.......................
delete strc; //как очистить память, тут около 100 мб, но они не 
очищаются
сорри за ламерство, раньше как-то не замечал такой мощнейшей утечки

>без замораживания

?

Деструктор напиши, и оттуда грохни каждый элемент в vector <structure1*> structs и structure2* ar2[256]. Или лучше вообще заюзай умные указатели

yoghurt ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

читал, и че, delete для указателей созданных с помошью new, а free для тех которые созданы с помощью malloc

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

пробовал, память не очищает

как ты это, кстати, проверял?

jtootf ★★★★★
()
Ответ на: комментарий от yoghurt

неважно кто сказал, но компы вешаются, после 20 таких созданий и удалений в течение дня, Вывод: не работает

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Если твой деструктор написан правильно, ты ищёшь не в том месте

yoghurt ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

его уже давно нет, я тыщу экспериментов уже провел ))))))) но было так: я каждый элемент удалял в деструкторе.

Можно вообще обойтись без удаления каждого элемента как нибудь?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

можно поподробнее? если я с помощью auto_ptr создам экз класса MyMegaStructure, то простым его удалением, очистится память внутри других указателей и т.д. ?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от anonymous

Я уже начитался спасибо, заработал красноглазие. зачем тогда вообще ЛОР? Троллить и флудить? Или все же помогать советами друг другу?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

я ознакомился как то давно с этими языками, в данном проекте они мне не интересны

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

она тебе не нужна, boost::shared_ptrы для тебя сейчас равносильны auto_ptr, так что не трать время на сборку, установку, а гугли и читай, есть куева куча хороших книг по С++.

Boy_from_Jungle ★★★★
()

Джефф Элджер. C++ for Real Programmers.

geekless ★★
()
Ответ на: комментарий от pozitiffcat

Не начитался, это сразу заметно, что вам ещё работать над собой и работать надо. Повышать квалификацию.

anonymous
()
Ответ на: комментарий от pozitiffcat

но было так: я каждый элемент удалял в деструкторе

ну так покажи, как именно ты это делал. времени пять минут, а нам всё интересно

jtootf ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

>boost::shared_ptrы для тебя сейчас равносильны auto_ptr

Почему ты так в этом уверен? Смотри, у него там целый вектор указателей. Наверняка указатели ещё шарятся между другими объектами, так что в общем случае именно shared_ptr

yoghurt ★★★★★
()

Если твой деструктор выглядит так:

(for int i=0;i<structs.size();i++)
 delete structs[i];
for(int i=0;i<256;i++)
 delete ar2[i];

то ошибка в другом месте.

staseg ★★★★★
()

ТС либо жирный тролль, либо очень тонкий петросян...

1. Не юзать массивы - есть вектор.

2. Удалять в деструкторе.

panter_dsd ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

> и хвататься сразу же за буст - это лишнее.

тем более, что shared_ptr есть по дефолту в gcc/msvc/icc, никакой буст и не нужен

aho
()
Ответ на: комментарий от Begemoth

Не учи плохому - shared_ptr или scoped_ptr гораздо удобнее.


У него там Qt, где своих умных указателей предостаточно.

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

про буст я читал и auto_ptr и отличия знаю, но опыт с ними не имел, и как они фактически себя ведут незнаю

pozitiffcat ★★★
() автор топика

Тебе нужно удалить каждый элемент structs и ar2 по отдельности.
Обязательно хранить данные по указателю?

JackyTreehorn
()
Ответ на: комментарий от JackyTreehorn

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

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

O_o а какие в Qt есть свои умные указатели?


Твою ж мать, мне хочется взять и затолкать... в тебя доку по Qt.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.