Кто-нить пользовался классом CList (вопрос по нему
От: Hark http://harksolve.umputun.com/sclads/
Дата: 08.08.01 01:16
Оценка:
Есть класс
class aaa{}
есть другой класс
class bbb
{
aaa* pointer;
}
У которого деструктор такого вида
bbb::~bbb()
{
if (pointer)
{
delete pointer;
pointer=0;
}
}

Создаю коллекцию в третьем классе

class ccc
{
CList<bbb, bbb&> list;
}

ну и в деструкторе пишу
ссс::~ccc()
{
while (list.GetCount()>0 ) // пробовал IsEmpty
{
list.RemoveHead();
}
}

так вот при вызове деструктора все ломается ( ASSERT гдето в heap)
но если убрать строчки
while (list.GetCount()>0 ) // пробовал IsEmpty
{
list.RemoveHead();
}
то все как бы работает.

Чувствую что что-то не так я делаю.

И другой вопрос (тоже по теме)
как проверить есть ли утечка памяти в моей программе ( может утилита какая ).
И что бы попроще (т.е. без переопределений операторов new и delete )
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Alex Fedotov США  
Дата: 08.08.01 04:58
Оценка:
Здравствуйте Hark, вы писали:

H>Есть класс

H>class aaa{}
H>есть другой класс
H>class bbb
H>{
H> aaa* pointer;
H>}
H>У которого деструктор такого вида
H>bbb::~bbb()
H>{
H>if (pointer)
H> {
H> delete pointer;
H> pointer=0;
H> }
H>}

Проверь, что pointer всегда корректно инициализируется.

H>Создаю коллекцию в третьем классе


H>class ccc

H>{
H>CList<bbb, bbb&> list;
H>}

H>ну и в деструкторе пишу

H>ссс::~ccc()
H>{
H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>}

H>так вот при вызове деструктора все ломается ( ASSERT гдето в heap)


Можно было бы и по подробнее про ASSERT.

H>но если убрать строчки

H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>то все как бы работает.

H>Чувствую что что-то не так я делаю.


H>И другой вопрос (тоже по теме)

H>как проверить есть ли утечка памяти в моей программе ( может утилита какая ).

BoundsChecker.

H>И что бы попроще (т.е. без переопределений операторов new и delete )


Хотел съязвить, потом передумал.
-- Alex Fedotov
Re: Кто-нить пользовался классом CList (вопрос по нему
От: kaziboba  
Дата: 08.08.01 07:21
Оценка:
Здравствуйте Hark, вы писали:

H>Есть класс

H>class aaa{}
H>есть другой класс
H>class bbb
H>{
H> aaa* pointer;
H>}
H>У которого деструктор такого вида
H>bbb::~bbb()
H>{
H>if (pointer)
H> {
H> delete pointer;
H> pointer=0;
H> }
H>}

H>Создаю коллекцию в третьем классе


H>class ccc

H>{
H>CList<bbb, bbb&> list;
H>}

H>ну и в деструкторе пишу

H>ссс::~ccc()
H>{
H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>}

H>так вот при вызове деструктора все ломается ( ASSERT гдето в heap)

H>но если убрать строчки
H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>то все как бы работает.

H>Чувствую что что-то не так я делаю.

Видимо ты неправильно работаешь с поинтерами в классе bbb; а ваще лучше используй смартпоинтер, вместо твоего bbb. он есть в стандартной библиотеке, auto_ptr называется.
И потом, зачем в деструкторе ссс цикл?!? достаточно list.RemoveAll();
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Alex Ostapenko Россия  
Дата: 08.08.01 08:18
Оценка:
Здравствуйте Hark, вы писали:

H>Есть класс

H>class aaa{}
H>есть другой класс
H>class bbb
H>{
H> aaa* pointer;
H>}
H>У которого деструктор такого вида
H>bbb::~bbb()
H>{
H>if (pointer)
H> {
H> delete pointer;
H> pointer=0;
H> }
H>}

А pointer изначально инициализируется нулем?
Re[2]: Кто-нить пользовался классом CList (вопрос по нему
От: Tim Россия RSDN.ru
Дата: 08.08.01 10:12
Оценка:
Здравствуйте Alex Ostapenko, вы писали:


AO>А pointer изначально инициализируется нулем?


Нет. Инициализируются только переменные объявленные как static. Так что лучше в конструкторе всегда писать aaa=NULL;
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re[3]: Кто-нить пользовался классом CList (вопрос по нему
От: Alex Ostapenko Россия  
Дата: 08.08.01 11:00
Оценка:
Здравствуйте Tim, вы писали:

Tim>Здравствуйте Alex Ostapenko, вы писали:



AO>>А pointer изначально инициализируется нулем?


Tim>Нет. Инициализируются только переменные объявленные как static. Так что лучше в конструкторе всегда писать aaa=NULL;


Ё-моё. Я это спрашивал у автора исходного вопроса с целью выяснить, не забыл ли он проинициализировать указатель, а не для того, чтобы мне объясняли, что автоматом он не инициализируется.
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Hark http://harksolve.umputun.com/sclads/
Дата: 08.08.01 11:08
Оценка:
1) поинтер инициализируется нулем обязательно
2) Вообще весь класс это

Конструктор
bbb::bbb()
{
pointer=0;

}

и деструктор
bbb::~bbb()
{
if (pointer)
{
delete pointer;
pointer=0;
}
}

имхо в нем ошибок нет.
Про ASSERT подробее напишу попозже.
Re[4]: Кто-нить пользовался классом CList (вопрос по нему
От: Tim Россия RSDN.ru
Дата: 08.08.01 11:18
Оценка:
Сорри !!!
Спутал Вас с автором вопроса.
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Hark http://harksolve.umputun.com/sclads/
Дата: 08.08.01 20:15
Оценка:
kaziboba
Вариант с RemoveAll — работает отлично, как только возвращаюсь к варианту
while (list.GetCount()>0 ) // пробовал IsEmpty
{
list.RemoveHead();
}
Выскакивает

Debug Assertion Failed

File: dbgheap.c
Line: 1017

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

И чего ему не нравиться ???

ЗЫ В тему RemoveAll не виден в выпадающем списке (который Ctrl+Space)
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Dmitriy  
Дата: 02.09.01 11:51
Оценка:
Здравствуйте Hark, вы писали:

H>И другой вопрос (тоже по теме)

H>как проверить есть ли утечка памяти в моей программе ( может утилита какая ).
H>И что бы попроще (т.е. без переопределений операторов new и delete )

Посмотри http://www.rational.com/products/purify_nt/manuals/purify6-5
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Noname  
Дата: 06.09.01 13:26
Оценка:
Hark, если я не ошибаюсь то классы ааа и ввв должны быть наследниками класса CObject
тогда всё должно работать нормально. Но я пользовался классом CObList и мне нужно
было обращаться элементам как к объектам для вызова их методов.
Если хотите взглянуть на исходники мыльте письмо на мыло — зарарю вышлю.
Re: Кто-нить пользовался классом CList (вопрос по нему
От: Noname  
Дата: 06.09.01 13:29
Оценка:
Моё мыло hobotan@mail.ru
Re[2]: Кто-нить пользовался классом CList (вопрос по нему
От: OneEyeMan  
Дата: 06.09.01 15:30
Оценка:
Здравствуйте Hark, вы писали:

H>1) поинтер инициализируется нулем обязательно

H>2) Вообще весь класс это

H>Конструктор

H>bbb::bbb()
H>{
H>pointer=0;

H>}


H>и деструктор

H>bbb::~bbb()
H>{
H>if (pointer)
H> {
H> delete pointer;
H> pointer=0;
H> }
H>}

H>имхо в нем ошибок нет.

H>Про ASSERT подробее напишу попозже.

А почесу поинтер инициализируется 0, а не NULL?
Игорь.
Re: Кто-нить пользовался классом CList (вопрос по нему
От: pg Россия  
Дата: 07.09.01 13:03
Оценка:
Здравствуйте Hark, вы писали:

H>Есть класс

H>class aaa{}
H>есть другой класс
H>class bbb
H>{
H> aaa* pointer;
H>}
H>У которого деструктор такого вида
H>bbb::~bbb()
H>{
H>if (pointer)
H> {
H> delete pointer;
H> pointer=0;
H> }
H>}

H>Создаю коллекцию в третьем классе


H>class ccc

H>{
H>CList<bbb, bbb&> list;
H>}

H>ну и в деструкторе пишу

H>ссс::~ccc()
H>{
H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>}

H>так вот при вызове деструктора все ломается ( ASSERT гдето в heap)

H>но если убрать строчки
H> while (list.GetCount()>0 ) // пробовал IsEmpty
H> {
H> list.RemoveHead();
H> }
H>то все как бы работает.

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

отнаследоваться от СLista :
class Primitive — чисто виртуальный.
class CPrimitiveList : public CList <Primitive*,Primitive*&>
{
public:
CPrimitiveList() {}
~CPrimitiveList()
{
/*здесь надо подумать, будут утечки памяти, обьекты будут копироваться, и просто как сделано ниже непройдёт...

POSITION pos = this->GetHeadPosition();
while(pos){
Primitive* prim;
prim = this->GetNext(pos);
delete prim;
}
this->RemoveAll();
}
CPrimitiveList( const CPrimitiveList &cprimitivelist )// конструктор копирования нужен, даже пустой
{ }
CPrimitiveList& operator=( CPrimitiveList &cprimitivelist )
{
this->RemoveAll();
POSITION pos = cprimitivelist.GetHeadPosition();
Primitive* prim;
while (pos){
this->AddTail(cprimitivelist.GetNext(pos));
}
return *this;
}
void Mymethod1(); // свои методы для листа
void Mymethod2(); // свои методы для листа
private:
};
Возмоно в твоём случае тема такая : ты выносишь гденить обьект а потом в дестркторе пытаешься вынести его ещё раз.
Относись ко всему осторожно, т.к. это может оказаться полным бредом.
Глеб
Re: Кто-нить пользовался классом CList (вопрос по нему
От: The Lex Украина  
Дата: 10.09.01 06:02
Оценка:
Здравствуйте Hark, вы писали:

H>...


Рекомендую воспользоваться щаблоном list<...> из STL — все прекрасно работает, в том числе и в проектах без MFC. Насколько я понимаю, единственный недостаток этого решения будет в том, что list<...> не поддерживает механизм сериализации MFC. Правда, это довольно просто обойти...
Голь на выдумку хитра, однако...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.