Есть класс
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 (вопрос по нему
Здравствуйте 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 (вопрос по нему
Здравствуйте 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 (вопрос по нему
Здравствуйте Tim, вы писали:
Tim>Здравствуйте Alex Ostapenko, вы писали:
AO>>А pointer изначально инициализируется нулем?
Tim>Нет. Инициализируются только переменные объявленные как static. Так что лучше в конструкторе всегда писать aaa=NULL;
Ё-моё. Я это спрашивал у автора исходного вопроса с целью выяснить, не забыл ли он проинициализировать указатель, а не для того, чтобы мне объясняли, что автоматом он не инициализируется.
Re: Кто-нить пользовался классом CList (вопрос по нему
kaziboba
Вариант с RemoveAll — работает отлично, как только возвращаюсь к варианту
while (list.GetCount()>0 ) // пробовал IsEmpty
{
list.RemoveHead();
}
Выскакивает
Здравствуйте Hark, вы писали:
H>И другой вопрос (тоже по теме) H>как проверить есть ли утечка памяти в моей программе ( может утилита какая ). H>И что бы попроще (т.е. без переопределений операторов new и delete )
Hark, если я не ошибаюсь то классы ааа и ввв должны быть наследниками класса CObject
тогда всё должно работать нормально. Но я пользовался классом CObList и мне нужно
было обращаться элементам как к объектам для вызова их методов.
Если хотите взглянуть на исходники мыльте письмо на мыло — зарарю вышлю.
Re: Кто-нить пользовался классом CList (вопрос по нему
Здравствуйте 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 (вопрос по нему
Здравствуйте 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 (вопрос по нему
Рекомендую воспользоваться щаблоном list<...> из STL — все прекрасно работает, в том числе и в проектах без MFC. Насколько я понимаю, единственный недостаток этого решения будет в том, что list<...> не поддерживает механизм сериализации MFC. Правда, это довольно просто обойти...