| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > И снова очередь |
| Автор: webgraf 7.6.2007, 11:39 | ||
Выдает ошибку при запуске(конкретно - при добавлении в очередь). Вроде как проблемы с кучей(dbgheap.c). Как правильно организовать в очередь из блоков данных?
|
| Автор: Fazil6 7.6.2007, 12:02 |
| удалено |
| Автор: webgraf 7.6.2007, 12:28 | ||
а вот со строками все просто работает:
Как с блоками данных быть? |
| Автор: Fazil6 7.6.2007, 12:34 | ||
тебе нужен конструктор копии. Поумолчанию будет тупо копировать unsigned char * buf и потом при удалении твоих объектов pdata в деструкторе будет пытаться вызывать free 2 раза для одного и тогоже участка памяти
|
| Автор: evGenie 7.6.2007, 12:37 | ||
А в строчке
ведь сначала создается объект (вызывается конструктор), а потом происходит вызов конструктора копий? Который, сгенерированный по умолчанию, в твоем случае не работает, т.к. память выделяется с помощью malloc(). Определи соответствующий конструктор и все. |
| Автор: korbian 7.6.2007, 12:39 |
| Констрктор копирования и оператор присваивания переопредели |
| Автор: korbian 7.6.2007, 13:38 |
| Выделяешь новую память и копируешь в нее содержимое pdata::buf копируемого объекта. |
| Автор: Fazil6 7.6.2007, 14:29 |
память должна по идее выделяется при создании каждого нового объекта , а в твоем варианте при копировании объектов получалось, что 2 объекта владеют одной и тойже памятью |
| Автор: webgraf 7.6.2007, 15:29 | ||
А деструктор не нужно править? У меня проблемы возникают когда pop делаю из очереди. Не находит голову очереди. korbian, не совсем понимаю... можешь кодом объяснить хоть немного? |
| Автор: Fazil6 7.6.2007, 15:40 | ||||||||
все он находит. В твоем коде
после того как эта строка отработает, локальный объект переданный в параметре разрушается и вызывается деструктор, который делает
но из-за отсытствия твоего конструктора копии объект сохраненный в очередь ссылается на этуже память. И когда ты делаешь pop , вызывается деструктор этого объекта и вызывается повторно free(buf); но этот buf уже освобожден
я же написал тебе конструктор копии раньше. В принципе его хватит чтобы от этой ошибки избавиться, но оператор присваивания тоже надо писать |
| Автор: webgraf 7.6.2007, 15:57 | ||
Fazil6, извини что отнимаю время своей тупостью, но пробую вот-так pop-ать :
И получаю как раз результат - второй раз front не находит голову. Это как раз из-за оператора присваивания? |
| Автор: korbian 8.6.2007, 08:48 | ||
|
| Автор: webgraf 8.6.2007, 11:31 | ||||
если убрать из конструктора, все равно не присваивает (( вот что получается:
|
| Автор: Fazil6 8.6.2007, 11:49 | ||
нету здесь присваивания... info у тебя не объект, а ссылка Добавлено через 3 минуты и 26 секунд точнее здесь уже есть присваивание, но самому себе Добавлено через 9 минут и 47 секунд вообще так работая ты получишь конечно эксепшен.
|
| Автор: webgraf 8.6.2007, 12:33 | ||
Но если каждый раз инициализировать ссылку, тоже ничего не получается:
|
| Автор: Fazil6 8.6.2007, 12:43 | ||||||
что не получается? То что у тебя написано должно работать нормально. После pop ссылку info использовать нельзя. Откажись от сылки
Добавлено через 2 минуты и 16 секунд вполне корректный код в свете того что у тебя было написано и он дожен работать
|
| Автор: _stranger_ 8.6.2007, 13:07 |
| необходимо добавить цикл while как это правильно показал Fazil6 |
| Автор: webgraf 8.6.2007, 13:30 |
| точно. застрелиться пора. огромное спасибо всем. |