2013-11-13 2 views
1

Итак, позвольте мне начать с ошибки. Я получаю эту ошибку сегм при запуске GDB:Ошибка ошибки сегментации в 0x00000000

#0 0x00000000 in ??() 
#1 0x0804aacc in find_closest_object (list=0x8052928, base=0xbffff148, 
dir=0xbffff130, last_hit=0x0, retdist=0xbffff0f0) at raytrace.c:34 
#2 0x0804ab96 in ray_trace (model=0x80528f0, base=0xbffff148, dir=0xbffff130, 
pix=0xbffff160, total_dist=0, last_hit=0x0) at raytrace.c:80 
#3 0x0804a99a in make_pixel (model=0x80528f0, x=0, y=0) at image.c:29 
#4 0x0804aa09 in make_row (model=0x80528f0, y=0) at image.c:47 
#5 0x0804aa53 in image_create (model=0x80528f0, out=0x8052788) at image.c:69 
#6 0x08048aed in main (argc=3, argv=0xbffff2b4) at main.c:30 

Так в основном, я получаю эту неизвестную ошибку с 0x00000000 в ??. Что на Земле это означает? На строке 34 на рейтрасе говорится:

dist = obj->hits(base, dir); 

Любая подсказка вообще по какой проблеме может быть? Я мог бы разместить больше, если нужно, но не уверен, что именно нужно. Спасибо за помощь!

EDIT: last_hit должен быть NULL, так что это не так.

+1

Нам нужно больше кода для определения проблемы. – 0x499602D2

+0

Любая идея, какой файл вам нужно будет видеть, судя по ошибке? Все затронутые файлы? Я могу, но это много кода. – user2781823

+0

Это означает, что вы меняете указатель NULL. Что означает * на самом деле * означает, что вам нужно пересмотреть свой алгоритм, и если вы все еще думаете, что с ним ничего не случилось, снова запустите свою программу в отладчике с помощью -g и найдите, откуда ваша ошибка. Трассировка стека указывает, где проблема. так что смотри тяжелее. один шаг, если дело доходит до него. Я предполагаю, что 'obj' - NULL. – WhozCraig

ответ

2

Вы можете вызвать виртуальную функцию, которая еще не была инициализирована. Когда C++ создает объект, он стремится очистить виртуальную таблицу, а затем скопировать части таблицы по мере необходимости. Если вы вызовете функцию до того, как все конструкторы будут запущены, то некоторые из этих указателей будут NULL, и попытка их вызова будет делать то, что вы описываете.

Однако, если obj-> hits() не является виртуальной функцией, то все, что оно делает, уничтожает стек, а возвращаемый IP-адрес равен NULL во время выполнения команды RTS (или ее эквивалента). В этот момент процессор пытается выполнить код на этом NULL-адресе. Это называется переполнением буфера, когда буфер создается в стеке.

Это две основные причины, по которым вы получили такие ошибки. В MS-Windows я видел, что это также произошло после того, как вы попытались освободить один и тот же буфер памяти более одного раза. Но это вряд ли закончится в NULL.

0

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

Возможно, это даст вам ошибку нарушения прав доступа.

Смежные вопросы