Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 13 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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

Вот исходный код деструктора:
Код:

 template <class T> array<T>::~array(){
  if(base){
    cell *res=base,*resn=base->next;
    for(;resn&&cnt;resn=resn?resn->next:0){
      delete res;
      cnt--;
      res=resn;
    }
  }
}


, где base - указатель на первую структуру, res-на текущую удаляемую, resn - на следующий за ним, cnt - количество элементов в массиве. Выдает ошибку Write of adress 00000008 и указывает на заголовок цикла, даже если он пустой - все операторы перенесены в тело. При выводе на экран сообщений - адресов указателей и количества элементов в массиве, видно, что после того как количество становится равным нулю, он идет на еще один заход цикла, после чего и происходит ошибка. Помогите кто-нибудь.



Партнер
 

Member
Статус: Не в сети
Регистрация: 06.09.2005
Откуда: Москва
nforcer.xs, используй вектор и не парься.


 

Bozz Bishop какой вектор? из стандартной STL? Так я потому и свой пишу, что меня он не устраивает по функциональности...
Как тебе создание нового элемента простым присваиванием вида arr["key"]=someval или arr[2]=someval ???


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
nforcer.xs очень запутанный код, вернее сложен для понимания, делай цикл от первого элемента до того, пока не получишь NULL, кол-во элементов вообще в условии цикла не используй. Я конечно понимаю, что С++ позволяет писать оператор ?: куда только можно, но так писат не стоит.
Добавлено спустя 10 минут, 5 секунд
Я забыл добавить, убивай элемент все время из головы списка, зачем извращатся :)
Добавлено спустя 1 минуту, 1 секунду
Кстати, для твоих целей случайно map не подойдет?

_________________
Ку ку


 

map не подойдет, я его рассматривал. Идеалом, на мой взгляд, являются хэши PHP, их-то я и пытался воспроизвести, насколько позволяет С++. В принципе, удалось все, кроме свободной типизации элементов в пределе одного хэша. Этого, в принципе можно также достичь, но уж больно сложно - не хочу связываться с указателями void*.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
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'или :D

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Daemon
Ну вот например, в массиве 1 элемент: base = new cell; base->next = 0. Смотрим деструктор: res = base (!=0); resn = base->next (==0). В цикле for сначала проверяется условие выполнимости цикла, т.е. resn&&cnt (==0), выдаётся false и тело цикла с delete res не выполняется --> утечка памяти.


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Билли Бонс
ага. ЩАЗ. У человека обратная картина - явно что-то лишнее удаляется или происходит чтение по не валидному адресу.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
А ошибка, из-за которой вылетает, судя по всему или в конструкторе, или в методе добавления элемента. (Т.е. там, где присваиваются значения этим base'ам и next'ам...)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Билли Бонс неа, base он может только инициализировать неправильно, т.е. где-то упустить элемент. Тут явно проблемы либо с логикой, либо с приведением типов, к тому же, я раньше упустил, а теперь заметил, что в первом посте:
Цитата:
При выводе на экран сообщений - адресов указателей и количества элементов в массиве, видно, что после того как количество становится равным нулю, он идет на еще один заход цикла, после чего и происходит ошибка.
Кстати, тут вам не здесь (не php), дебажные printf и MessageBox'ы нужно выбрасить, отладчики есть :)

_________________
Ку ку


 

Самое смешное, что все внезапно заработало... Может у меня система глючила? Хотя странно конечно - ничего не делал... Администраторы - тему на снос.

ЗЫ: Всем спасибо за внимание и участие...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 13 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan