Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > delete


Автор: gepard 14.10.2004, 12:12
Проблема в том, что с помощью new у одного указателя я выделяю порядка 1 мега памяти в процессе программы.Когда я вызываю delete, то чистится памяти только порядка 100-400 кб. Почему? И как мне чистить всю память?

Автор: _hunter 14.10.2004, 12:22
а она точно не освобождается ( CodeGuard вопит, например )
или это TaskManager показывает?

Автор: chipset 14.10.2004, 12:33
gepard
А может в тех обьектах который удаляешь есть какие то свои указатели на области памяти и надо их в деструкторе удалять?

Автор: Step 14.10.2004, 12:43
тебе выдало сообщение что есть утечка памяти... ????


Автор: gepard 14.10.2004, 13:05
Цитата
тебе выдало сообщение что есть утечка памяти... ????

Нет
Цитата
а она точно не освобождается ( CodeGuard вопит, например )
или это TaskManager показывает?

Нет
Цитата
А может в тех обьектах который удаляешь есть какие то свои указатели на области памяти и надо их в деструкторе удалять?

В одном классе - да, а в другом нет. Значит память, если есть ещё вложенный указатель, из-под него надо отдельно освобождать? Попробуем...

Автор: chipset 14.10.2004, 13:07
Цитата
Значит память, если есть ещё вложенный указатель, из-под него надо отдельно освобождать?

А для чего по твоему созданы деструктора?

Автор: gepard 14.10.2004, 13:13
Стоп... правильно...я освобождаю...
У меня всё правильно в коде. Я в дестукторе освобождаю память!
Лажа в чём-то другом

Автор: _hunter 14.10.2004, 13:20
не совсем понятен "нет" на мой вопрос smile.gif
"нет" относится к части про CodeGuard или к части про TaskManager?

Автор: gepard 14.10.2004, 13:29
_hunter
CodeGuard - ???
TaskManager - неа...

Кстати, я сейчас позырил ещё раз: нет, это я в другом проекте брал указатель в классе, который являлся указателем(класс). Тут в чём-то другом лажа...

Автор: chipset 14.10.2004, 13:31
Короче без кода нифига не понимаю.. stena.gif

Автор: _hunter 14.10.2004, 13:35
CodeGuard -- в Builder' e следит за утечками

но код бы не помешало увидеть ;)

Автор: Vyacheslav 14.10.2004, 13:45
CodeGuard не используется, ТaskManager не показывает, тогда откуда данные об утечке?
От Святого Духа?

Автор: DENNN 14.10.2004, 14:59
Я думаю, что все же брались данные с таскменеджера smile.gif
Память то освобождается, просто винда не спешит выделенную страницу памяти у приложения отбирать - вдруг сейчас опять попросят smile.gif

Автор: gepard 15.10.2004, 04:19
Vyacheslav
Ошибка по типу "отправить отчёт" или "Не отпралвять" hehe.gif
Код вечерком выложу...
Сейчас в ВУЗ надо валить

Автор: Adil' 15.10.2004, 08:45
Цитата(gepard @ 15.10.2004, 04:19)
Ошибка по типу "отправить отчёт" или "Не отпралвять"

И причем здесь утечка памяти?! Скорее наоборот - "наступил" на не выделенную smile.gif

Автор: val 15.10.2004, 09:36
На всякий случай попробуй повставлять printf(ы) во все твои деструкторы, возможно, кто-то кого-то не вызывает...

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

Автор: gepard 15.10.2004, 15:15
Adil' 
Глупости городишь. Ошибка-то при delete получается. Памяти освобождается мало... stena.gif
Короче ладно. Я буду всё равно сейчас структуру переделывать...
Если тажа хрень будет - подниму тему thumbs-up.gif

Автор: chipset 15.10.2004, 15:36
В последние четыре поста (кроме Val'иного) не врубился нифига.. stena.gif

Автор: Adil' 15.10.2004, 16:02
Цитата(chipset @ 15.10.2004, 15:36)
В последние четыре поста (кроме Val'иного) не врубился нифига..
А cвой в эти четыре посчитал? biggrin.gif
Цитата(gepard @ 15.10.2004, 15:15)
Глупости городишь.
Фи, как грубо.
Цитата(gepard @ 15.10.2004, 15:15)
Ошибка-то при delete получается. Памяти освобождается мало...
Если ошибка получается при delete то откуда следует вывод что Памяти освобождается мало???
Такая ошибка обычно вылезает, если delete обращается к "левому" адресу, уже освобожденному, но не обнуленному, например.

Автор: Vyacheslav 15.10.2004, 16:55
Цитата(gepard @ 15.10.2004, 04:19)
Vyacheslav
Ошибка по типу "отправить отчёт" или "Не отпралвять" hehe.gif
Код вечерком выложу...
Сейчас в ВУЗ надо валить

Ну и терминология.
Если имеется в виду Access Violation, то она как раз должна на delete и наооборот означает то что памяти особождается через чур много biggrin.gif
Ты где-то особождаешь то что еще не выделил или проводишь освобождение по второму разу.

Автор: bel_nikita 16.10.2004, 00:10
gepard
я не знаю, но если юзаешь классы и динамическое выделение/удаление объектов, то все базовые классы должны быть с виртуальными деструкторами:
virtual ~ClassDestructor();

Автор: gepard 16.10.2004, 08:57
Vyacheslav
У меня в голове все проекты перемешались: ошибка по типу "Отправлять отчёт или нет" вылезает у меня в другом проекте, а в этом просто памяти мало освобождается.
Вот исходник rtfm.gif
Код

typedef float pos3d[3];
typedef float rgba[4];
enum ParticlesType
{
_POINTS,
_BLBSURFACE,
_MODELS
};
class TexturesCls
{
public:
 TexturesCls();

 void     SetTexture(unsigned int min_filter, unsigned int mag_filter);
 bool     LoadTGA(char*);

 bool     layered;
 unsigned int   id;
 unsigned int   data;
 rgba     color;
};
class  Particles
{
public:
 pos3d     gc;
 bool     exist;
 float     dir_speed[3];
 float     dir[3];
 float     spawn_point[3];
 double    life_time;
};
class Particles_Emmiter
{
public:
 Particles_Emmiter();
 void     Particles_Process();
 void     Draw_Particles();
 void     Burn_Particle(unsigned int num);

 unsigned int   particles_pear_fire;
 unsigned int   particles_count;
 float     angel_x;
 float     angel_z;
 float     particles_size;
 float     particles_speed;
 float     delay;
 float     dir[2];
 float     life_time_for_particles;
 double    time_of_last_delay;
 int     dir_angel[2];
 bool     full_angel[2];
 bool     active;
 Particles    particle[1024];
 pos3d     gc;
 ParticlesType   particles_type;
 rgba     color;
};
TexturesCls*     texture;
Particles_Emmiter*    particles_emmiter;
...
texture=new TexturesCls[10];
particles_emmiter=new Particles_Emmiter[10];
...
void somefunction()
{
if (texture)
{
 delete [] texture;
 texture=0;
}
if (particles_emmiter)
{
 delete [] particles_emmiter;
 particles_emmiter=0;
}
}

Функция somefunction() вызывается по нажатию опред. клавиши.

Автор: MaxWave 8.3.2006, 20:50
Люди, спасите помогите!!!

Короче есть игра - змейка. Я создаю раздные доски (та, по к-й движется змея) размером m*n. Есть ф-я, которая загружает доску опр. размера. Юзер щелкае по вариантам, и доски меняются.
В начале ф-ии делаем так:
Код

delete [] massiv;
massiv=new int [n*m];


Это есть типа "2-мерный " массив доски, где в каждую клетку заносится цифра для служебного пользования.

Прожект компилится, запускается, все окей. Причем в Debug компиле никаких проблем (только тормозов больше). Когде делаем Relise, запускается все окей. Но когда начинаем многократно менять доски, т.е вызывать эту ф-ю, то прога вылетает (отправить отчет или нет). В чем может быть дело???

ссылка на змею
http://www.ogre3d.org.ru/download.php?list.6


Автор: MAKCim 8.3.2006, 22:11
gepard
в приведенном коде насколько я вижу нет утечки, с чего ты взял, что она есть?

Автор: Nuzur 9.3.2006, 10:31
Цитата(Adil' @ 15.10.2004, 08:45)
Цитата(gepard @  15.10.2004,  04:19)
Ошибка по типу "отправить отчёт" или "Не отпралвять"

И причем здесь утечка памяти?! Скорее наоборот - "наступил" на не выделенную smile

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

Автор: Neitron 9.3.2006, 13:19
Цитата(Nuzur @ 9.3.2006, 10:31)
и поночам спать трудно(если конечно совесть есть).

Гы, гы))) Да да....
Утечка мучает всегда и кошмарные сны, когда компьютер орет, на тебя во сне.

Автор: CPlusPlusFAN 13.3.2006, 03:06
MaxWave,
Цитата(MaxWave @ 8.3.2006, 20:50 Найти цитируемый пост)
В чем может быть дело???

Попробуй так:
Код

int *massiv=NULL;



if (massiv) delete [] massiv;   
massiv=new int [n*m];

А чего, в конце не удаляешь?

Автор: MaxWave 13.3.2006, 20:02
Код

int *massiv=NULL;

А чем эта лучше?

Не удаляю в конце, т.к
Код

massiv=new int [n*m];


вызывается у меня все время c разными m и n. А перед созданием нового массива надо удалить старый. Скачай с cсылки змею, там есть эта строчка, посмотри, мож че скажешь... (ф-я loadScene).

Автор: CPlusPlusFAN 15.3.2006, 17:40
MaxWave,
Вот это:
Код

int *massiv=NULL;


для этого:
Код

if (massiv) delete [] massiv;


чтобы не удалять того, чего нет.


Цитата(MaxWave @ 13.3.2006, 20:02 Найти цитируемый пост)
Не удаляю в конце

А следовало бы, чтобы massiv у тебя не зависал в памяти. (Удаляй при завершении программы)

Автор: CPlusPlusFAN 15.3.2006, 18:34
MaxWave, я скачал: работа выполнена на совесть.
Я видел у тебя несколько таких удалений массива.
Поэтому я бы посоветовал тебе каждый раз, когда что-то удаляешь, проверить на NULL:
вначале
Код

int *massiv=NULL;


затем
Код

if (massiv) {delete[] massiv;
                   massiv=NULL;}//Лишним не будет


а уж потом, когда надо
Код

massiv=new int[n*m];


Я конечно не уверен, но такие ошибки могут быть из-за вмешательства в память. Посмотри, не удаляешь ли ты ещё какой-нибудь указатель...

Последний раз, когда у меня была такая ошибка, я пытался в Виндосе работать с прерываниями...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)