Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> null pointer assigment, странный баг 
:(
    Опции темы
xvr
Дата 14.5.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 13.5.2008,  21:00)
xvr, спасибо тебе большое за объяснение!
Счас в качестве типа Т использую не объект а указатель на него, и ошибки такой больше нет.  smile 

Получается, что если в качестве Т подставлять объект (а не указатель на него) то в  присваивании header = NULL; объект Т, содержащийся в header, будет "пытаться" создаться по нулевому адресу...

Ошибка не в этом, а в вызове метода setnext передавая в качестве this NULL
PM MAIL   Вверх
H4nter
Дата 15.5.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Но если T у нас указатель на объект, то такое присваивание допустимо (такой ошибки не возникает)
PM ICQ Jabber   Вверх
xvr
Дата 15.5.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 15.5.2008,  09:56)
Но если T у нас указатель на объект, то такое присваивание допустимо (такой ошибки не возникает)

Ошибка не в присваивании, а 2мя строками ниже:
Код

  header = NULL;
  win = header;
  header->setnext(header); // <<< Тут
Последняя строка эквивалентна NULL->setnext(NULL)
Смотрим в setnext:
Код

template<class T> class CNode {
private:
  T _val;
  CNode *_next;    // связь к последующему узлу
 ...
};

template<class T> void  CNode<T>::setnext(CNode<T> *b)
{
_next=b;
}
 Т.е. запись в поле _next приведет к записи NULL по смещению sizeof(T). Если размер T достаточно большой, то портится сигнатура в начале памяти, если же T указатель (в данной модели памяти он займет 2 байта), то будет произведена запись 2 нулей по смещению 2. Так как сигнатура включает 4 нулевых байта в начале, то такая запись останется необнаруженной, что однако не означает, что так и надо делать  smile 
PM MAIL   Вверх
H4nter
Дата 15.5.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



но если так лучше не делать, то как по другому? 
Ведь если не присваивать NULL то потом не определить пустоту списка...
PM ICQ Jabber   Вверх
xvr
Дата 15.5.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 15.5.2008,  12:29)
но если так лучше не делать, то как по другому? 
Ведь если не присваивать NULL то потом не определить пустоту списка...

Не надо делать header->setnext(header);, а делать header = NULL; надо.

PM MAIL   Вверх
H4nter
Дата 15.5.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Ну а как же мне тогда сделать его кольцевым?  smile 
Ну допустим я убрал header->setnext(header); Самое интересное, что ошибка осталась!
начинаю коментировать строчку за строчкой... и что же я вижу? при коментировании строки header = NULL;
ошибка пропадает... Получается ему не нравится именно строчка  header = NULL;, и как же обойти это?  smile 

Это сообщение отредактировал(а) H4nter - 15.5.2008, 14:33
PM ICQ Jabber   Вверх
xvr
Дата 15.5.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 15.5.2008,  14:32)
Ну а как же мне тогда сделать его кольцевым?  smile 

У тебя еще нет списка, нет головного элемента, сплошные NULL поинтеры. Что ты собрался закольцовывать?
Цитата

Ну допустим я убрал header->setnext(header); Самое интересное, что ошибка осталась!
У тебя та же бага в строке 97, возможно и еще где то
Цитата

начинаю коментировать строчку за строчкой... и что же я вижу? при коментировании строки header = NULL; ошибка пропадает...
 Если закоментировать эту строку, то вся программа начинает работать с мусором в header, поведение непредсказуемое (и то, что она не ругается по выходу еще ничего не значит)
Цитата

Получается ему не нравится именно строчка  header = NULL;, и как же обойти это?  smile
Ему не нравится вызов методов через NULL в качестве this, удаление   header = NULL; позволяет затоптать проблему, но не решить ее  smile 
PM MAIL   Вверх
H4nter
Дата 16.5.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 15.5.2008,  15:56)
Ему не нравится вызов методов через NULL в качестве this

ну а если не вызывать метод, а объявить _next в публик части класса, и вызывать так: header->_next=header, то все равно проблема остается...
PM ICQ Jabber   Вверх
xvr
Дата 16.5.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 16.5.2008,  17:32)
Цитата(xvr @ 15.5.2008,  15:56)
Ему не нравится вызов методов через NULL в качестве this

ну а если не вызывать метод, а объявить _next в публик части класса, и вызывать так: header->_next=header, то все равно проблема остается...

Блин, ну сколько можно  smile header РАВЕН NULL !!! НЕЛЬЗЯ ПО НЕМУ НИЧЕГО ПРИСВАИВАТЬ !!! НИ В МЕТОДЕ, НИ НЕПОСРЕДСТВЕННО !!! НИКАК !!!

Код

 **                          **
  *                           *                          *                                        *
  * ***   ****    *****   *** *   ****   ** ***           ***            ** ***   ****   **  **  *****
  **  *  ******       *  *   **  ******   **     ******      **           **  *  ******   ****    *
  *   *  *       ******  *    *  *        *               ***             *   *  *        ****    *   *
 *** ***  *****  **** **  ******  *****  *****           *               *** ***  *****  **  **   ****

                                                                ********

 *** *** ******   ****** ***      * ***    *****    *       *       *
  *   *   *   *    *  *   *       **  *   *   *     *       *       *
  *****   ***      *  *   ****      **    *   *     *       *       *
  *   *   *        *  *   *   *       *    ****     *       *       *
  *   *   *   *    *  *   *   *       *   *   *
 *** *** ******  **  *** *****    ****   *   ***    *       *       *

PM MAIL   Вверх
H4nter
Дата 17.5.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 16.12.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 16.5.2008,  21:35)
 НИКАК !!!

Теперь ясно, сори конечно, но просто ты пишешь сначала про вызов метода через NULL не нравится, а потом что мол присваивании NULL указателя по нему нельзя. Вот я и подумал сначала, что это именно в вызове метода дело(вызов метода для NULL указателя), и что можно попробовать без метода обойтись...  smile  Вообще понятно, и жаль конечно что обойти это никак нельзя, кроме как не присваивать NULL header (о чем я и писал выше)

Это сообщение отредактировал(а) H4nter - 17.5.2008, 17:35
PM ICQ Jabber   Вверх
xvr
Дата 17.5.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(H4nter @ 17.5.2008,  17:32)
Вот я и подумал сначала, что это именно в вызове метода дело(вызов метода для NULL указателя), и что можно попробовать без метода обойтись...  smile  Вообще понятно, и жаль конечно что обойти это никак нельзя, кроме как не присваивать NULL header (о чем я и писал выше)

Исправить это можно удалив вызов setnext в этих местах. Присваивание header->_next=header так же делать нельзя. Удалять же инициализацию header=NULL; нельзя - это не исправит предыдущей ошибки и добавит новую.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.