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 мб, но они не 
очищаются
сорри за ламерство, раньше как-то не замечал такой мощнейшей утечки

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

познаний c++ достаточно

Развели дискуссию, а толку никакого. ТС ведет себя как тролль (тупняк forever).

ТС хочет простое решение - серебряную пулю, которой можно эффективно, безболезненно и безопасно прострелить себе ногу.

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

pozitiffcat-у я бы по советовал просто сесть и подумать. Начать в конце концов разгребать те несчастные 15 тыс. строк кода. В любом случае надо сначала понять истинную причину утечек, а лишь потом приступить к её устранению. Если ТС так не сделает, то он ССЗБ.

Всякими auto_ptr,shared_ptr,scoped_ptr надо пользоваться тогда (и только тогда), когда ты понимаешь как они работают и почему они устроены именно так, а не как-то иначе. Если ты будешь тупо лепить умные указатели во все дыры, то опять ССЗБ. У умных указателей есть свои грабли. В любом случае думать придется.

Хотя соглашусь с тем, что изучить shared_ptr и scoped_ptr - это хороший совет.

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

Человека от быдлокодера отличает умение читать.

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

>деструктор вы не увидите его давно нет
и что, течет? правда?

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

деструктор вы не увидите его давно нет, как следствие моих экспериментов. Но он был таков, что в цикле удалял оператором delete элементы массивов и т.п.


тяжело снова написать пару строк?

Boy_from_Jungle ★★★★
()
myClass::myClass()
{
    static int once = 0;
    for(int i=0;i<10000000;i++)
    {
        int new_int = 4219078;
        vec.push_back(new_int);
    }
    if(once==2) return;
    once = 2;
    myClass* myc = new myClass();//внимание шаг 1!!!  
}

myClass::~myClass()
{

}


void MainWindow::on_pushButton_clicked()
{
    my = QSharedPointer<myClass>(new myClass); //шаг 2
}

void MainWindow::on_pushButton_2_clicked()
{
    my.clear(); //вот я чищу но 50 метров памяти в утечке! потомучто я не удалил тот указатель в шаге 1, можно одним выстрелом убить 2 зайцев не прописывая все в деструкторе?

}

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

деструктор вы не увидите его давно нет

Чувак не осилил VCS, но набыдлокодил 100500 мильёнов 15 тыс. строк. И еще при том, что:

пол года уже целый город сидит на моей программе

Былинный успех!

geekless ★★
()
Ответ на: комментарий от pozitiffcat
myClass::myClass()
{
    static int once = 0;
    for(int i=0;i<10000000;i++)
    {
        int new_int = 4219078;
        vec.push_back(new_int);
    }
    if(once==2) return;
    once = 2;
    myClass* myc = new myClass();//внимание шаг 1!!!  
}

У меня галлюцинации, или это рекурсия?

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

это к примеру, не бойтесь я так не делаю

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

Сделайте меня развидеть это...

> myClass::myClass()

{

...


myClass* myc = new myClass();//внимание шаг 1!!!


}



my.clear(); //вот я чищу но 50 метров памяти в утечке!


И что же ты, милок, там чистишь, если ты нигде не сохранил указатель на выделенный объект?

Вообще, всё это настолько безблагодатно и мозгоразрывающе, что так и просится на http://community.livejournal.com/code_wtf.

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

> деструктор вы не увидите его давно нет, как следствие моих экспериментов. Но он был таков, что в цикле удалял оператором delete элементы массивов и т.п.

А теперь ты спрашиваешь, как тебе разобраться с утечкой памяти? Переходи на языки на платформах с GC.

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

а по русски?

Может ты сам сначала свою мысль по-человечески оформишь?

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

Итого: читать не умеет, писать без ошибок не умеет, используемого языка программирования не знает, отлаживать не умеет, с VCS не знаком. И вот сейчас со всей очевидностью выясняется, что гуглом пользоваться тоже не умеет.

Зато мы все быдлокодеры, ага.

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

класс!! спасибо. он память того объекта сразу очистил, потому что указатель потерялся и следовательно не нужен! Вот это мне и нужно было! Спасибо. 3 страницы демагогии ради этого. Пошел править код...

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

> например? только не интерпретируемые...

Тебя интересуют компилируемые в байткод? С JIT? Или просто с возможностью компиляции в нативные бинарники?

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

мне кажется программа South которая работает через опу в qemu которая не дружит с оборудованием, еще более сильно напрягала этот город )))))) в которой одни костыли

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

до тебя дошло?!
Тебе кстати это в первом же посте и написали :)

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

> ObjC - прикольно, он актуален?

Apple считает, что да

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

Это кто? Он наверное заново под другим именем зарегился

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

> деструктор вы не увидите его давно нет, как следствие моих экспериментов.

Системы контроля версий не осилил?

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

>Актуален и писать на нём проще. Не нужны костыли для сообщений.

UI

под макось?

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

Почему тролль?
Вот почему на ЛОРе всех сейчас модно называть троллями?

Какой он тролль, он просто малолетний провинциальный дебил.

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

> Вот почему на ЛОРе всех сейчас модно называть троллями?

Не на ЛОРе, а в интернете. Модно слово, блин.

anonymous
()

Microsoft, чтобы решить проблемы управления памятью в C++, накатала в своем COM/OLE килотонны костылей - свой аллокатор, с возможностью отслеживания его вызовов(ну, IMallocSpy), счетчики ссылок в интерфейсах, все эти SAFEARRAY и BSTR и пр., написала кучу гайдлайнов по их пользованию, в которых комментируется каждый мелкий момент.

И в итоге что? Забила болт на все это говно, вместе с C++ и толкает .NET
А почему? Какая у .NET отличительная черта?

Потому что C++ говно, и потому, что проблемы с управлением памятью в нем не решить никак.

Но нет же, все равно, по-прежнему, каждый 17-летний(а то и 25+летний) долбоеб(тысячи их, особенно в бСССР почему-то), наговнокодивший парочку хеловордов на плюсцах думает, что это все фигня, главное писать правильно, и что он-то уж точно будет так, правильно, писать, и что ему-то уж точно все эти проблемы C++ по-плечу. Даже MS не по плечу, а ему по-плечу(ну хуле, в MS то индусы, это все знают, там только операционные системы всякие умеют писать, куда MS с этой мелочью до него, великого безупречного спеца на C++ и до его хелловордов).

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

>Microsoft, чтобы решить проблемы управления памятью в C++, накатала в своем COM/OLE килотонны костылей

А можно пруф? То есть ссылку, подтверждающую сказанное.

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

> У меня галлюцинации, или это рекурсия?

она далеко не идет, из-за static int once = 0;

static int once = 0; вообще мощнейший перл

топикстартер пусть живет, такого веселья я даже на говнокод.ру не видел

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

мля.. я ж говорил где-то что на скорую руку наваял :D

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

А можно пруф? То есть ссылку, подтверждающую сказанное.

Конечно, держи: http://prooflink.ru/

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

>Задело за живое, да, плюсолюбитель? Никакого троллинга, между прочим.

выкинь все программы, которые написаны на говноплюсах и переносимых макроассемблерах - там все равно уже никогда не удастся решить проблемы с памятью. пользуйся только теми, которые написаны на языке ${SILVERBULLET}. это будет честно, логично и последовательно. к тому же, с неработающим компом ты будешь безвреден.

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