Значит, предистория такова: я решил написать собственный контейнерный класс - массив, реализовал его в виде двусвязного списка самоадресующихся структур. Класс - естественно, шаблонный. Но тут выяснилась проблема - при вызове деструктора (например, оператором delete) программа постоянно вылетает с ошибкой, причем как бы я не пытался обойти эту ошибки, даже путем примитивной подгонки - ничего не выходит. Причем посылает меня там, где собственно ничего не происходит.
, где base - указатель на первую структуру, res-на текущую удаляемую, resn - на следующий за ним, cnt - количество элементов в массиве. Выдает ошибку Write of adress 00000008 и указывает на заголовок цикла, даже если он пустой - все операторы перенесены в тело. При выводе на экран сообщений - адресов указателей и количества элементов в массиве, видно, что после того как количество становится равным нулю, он идет на еще один заход цикла, после чего и происходит ошибка. Помогите кто-нибудь.
Bozz Bishop какой вектор? из стандартной STL? Так я потому и свой пишу, что меня он не устраивает по функциональности...
Как тебе создание нового элемента простым присваиванием вида arr["key"]=someval или arr[2]=someval ???
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
nforcer.xs очень запутанный код, вернее сложен для понимания, делай цикл от первого элемента до того, пока не получишь NULL, кол-во элементов вообще в условии цикла не используй. Я конечно понимаю, что С++ позволяет писать оператор ?: куда только можно, но так писат не стоит. Добавлено спустя 10 минут, 5 секунд Я забыл добавить, убивай элемент все время из головы списка, зачем извращатся Добавлено спустя 1 минуту, 1 секунду Кстати, для твоих целей случайно map не подойдет?
map не подойдет, я его рассматривал. Идеалом, на мой взгляд, являются хэши PHP, их-то я и пытался воспроизвести, насколько позволяет С++. В принципе, удалось все, кроме свободной типизации элементов в пределе одного хэша. Этого, в принципе можно также достичь, но уж больно сложно - не хочу связываться с указателями void*.
nforcer.xs Покажи объявление класса что ли... Так не понять, что здесь не работает. Из возможных глюков: по-моему у тебя не удаляется последний элемент списка.
Кстати, если не секрет, зачем тебе cnt? Для функции size кешируешь?
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Билли Бонс удалиться, и похоже на то, что происходит чтение по не валидному указателю на resn=resn?resn->next:0, вообщем могу посоветовать как советовал Страуструп cont int NULL = 0; А также пройтись отладчиком.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
джедайский код а) по стандарту понапихал бы приведения типов для переносимости, в т.ч. и NULL юзал бы заместо 0 (в общем случая NULL!=0)
б) аналогично более читаемо написал бы цикл и переход по элементам
возможно ошибка ушла бы. Если нет, то начинал дебажить...
Цитата:
он идет на еще один заход цикла, после чего и происходит ошибка.
явная ошибка по логике, но лучше было привести пример прямо с выводом.
А ащыпку сразу не найду - код obfuscat'или
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Daemon Ну вот например, в массиве 1 элемент: base = new cell; base->next = 0. Смотрим деструктор: res = base (!=0); resn = base->next (==0). В цикле for сначала проверяется условие выполнимости цикла, т.е. resn&&cnt (==0), выдаётся false и тело цикла с delete res не выполняется --> утечка памяти.
А ошибка, из-за которой вылетает, судя по всему или в конструкторе, или в методе добавления элемента. (Т.е. там, где присваиваются значения этим base'ам и next'ам...)
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Билли Бонс неа, base он может только инициализировать неправильно, т.е. где-то упустить элемент. Тут явно проблемы либо с логикой, либо с приведением типов, к тому же, я раньше упустил, а теперь заметил, что в первом посте:
Цитата:
При выводе на экран сообщений - адресов указателей и количества элементов в массиве, видно, что после того как количество становится равным нулю, он идет на еще один заход цикла, после чего и происходит ошибка.
Кстати, тут вам не здесь (не php), дебажные printf и MessageBox'ы нужно выбрасить, отладчики есть
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения