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


Автор: NiCketT 23.5.2008, 03:21
1. Неработают деструкторы (я их закоментировал)
2. В конце проги постоянно выскакивает какая-то ошибка.
3. В релизе выскакивает та же самая (или похожая) ошибка, только уже в начале проги (т.е. релиз неработает)
Хелппп!!!  smile 

Автор: rrrFer 23.5.2008, 09:38
NiCketT
у меня никаких ошибок не выскакивет, напиши где именно и какая

Автор: rainbow86 23.5.2008, 09:58
А почему ты думаешь что не работают деструкторы. Если есть new значит где то должен быть delete!!! Большая вероятность того что именно из-за этого и вылетает в конце!!!

Добавлено через 2 минуты и 31 секунду
расскоментируй деструкторы и посмотри что происходит после сортировки

Код


countrys.sort(); //отсортироать



Указатели на массивы городов в второй и третьей стране становятся невалидными!!!

Автор: pilotnet 23.5.2008, 11:39
У меня вылетает на функции
Код

void City::AddMoney(unsigned wher, int how_many){
    coins[wher]+=how_many;
};

не стал разбираться 
но рекомендую убрать все массив и заменить их на вектора
и всегда проверяй индексы - это стандартная ошибка новичка(и не только новичка)
а в данном случае вообще можно отказатся от указателей и сделать все статически 
это куда надежней и никаких деструкторов не надо

Автор: bronislav 24.5.2008, 18:43
Дело, в том, что память, которая была распределена в конструкторе с пом. оператора new, автоматически т.е. без использования оператора delete освобождается в даструкторе.

Таким образом в дестуркторе ты пытаешься освободить память, которая тебе уже не пренадлежит и соответственно вылетве ошибка.

Автор: NiCketT 24.5.2008, 23:32
ухты! я и не знал.
т.е. можно обойтись вообще без деструкторов, я правильно понимаю?

Автор: mes 25.5.2008, 00:02
Цитата(bronislav @  24.5.2008,  18:43 Найти цитируемый пост)
Дело, в том, что память, которая была распределена в конструкторе с пом. оператора new, автоматически т.е. без использования оператора delete освобождается в даструкторе.


с каких это пор ?!  smile 

Автор: bronislav 25.5.2008, 08:19
Цитата(mes @  25.5.2008,  00:02 Найти цитируемый пост)
с каких это пор ?!

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

Потом я еще делал експеримент, выделяя память в конструкторе и не освобождая в деструкторе, и память освобождалась. Можеи это конечно и не по стандарту, но ...

Автор: rrrFer 25.5.2008, 08:40
bronislav, 
Цитата(bronislav @  25.5.2008,  08:19 Найти цитируемый пост)
делал експеримент, выделяя память в конструкторе и не освобождая в деструкторе, и память освобождалась.

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

Автор: Artemon 25.5.2008, 08:48
Цитата

Дело, в том, что память, которая была распределена в конструкторе с пом. оператора new, автоматически т.е. без использования оператора delete освобождается в даструкторе.

Таким образом в дестуркторе ты пытаешься освободить память, которая тебе уже не пренадлежит и соответственно вылетве ошибка.


Прошу не вводить в заблуждение людей.

Если вызвался деструктор, то значит он удалит сам объект, которому принадлежит.
А если в объекте есть указатели на которые тоже была выделена память она так и останется  выделенной, более того, она  станет недоступной. 

пример:
Код

class A
{
 private:
            int* Ptr; 
 public: 
            A()
             {
             Ptr = new int[1024];
             }
             ~A()
             {
             delete [] Ptr;
             }  
};


Код

A* obj = new A;
delete obj;


В резальтате вызовится деструктор, который удалит объект A, затем вызовится delete [] Ptr, который удалит динамический массив.

Автор: bronislav 25.5.2008, 09:05
Цитата(Artemon @  25.5.2008,  07:48 Найти цитируемый пост)
Если вызвался деструктор, то значит он удалит сам объект, которому принадлежит.
А если в объекте есть указатели на которые тоже была выделена память она так и останется  выделенной, более того, она  станет недоступной. 


Cпасибо, за разъяснения! Буду знать и не вводить в заблужедние

Автор: NiCketT 25.5.2008, 11:25
Всем спасибо! Тема закрыта. Вопрос решон smile

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