2010-11-30 2 views
2

У меня есть этот код. указатель поворачивается на 0x0 непосредственно перед его использованием. раньше, у него был правильный адрес.Указатель мгновенно 0x0

TreeViewColumn *col; 
col = preview->get_column(pcFolder); /* col = 0x7fff5fc404a0 */ 
col->set_resizable(true);   /* col = 0x0 */ 

Я использую Gtkmm 2.4, но возвращает ожидаемое значение, оно просто превращается в 0x0. что не так?

GDB доказательство:

151    col = preview->get_column(pcFolder); /* col = 0x7fff5fc404a0 */ 
(gdb) print col 
$1 = ('Gtk::TreeViewColumn' *) 0x7fff5fc404a0 
(gdb) print *col 
warning: can't find linker symbol for virtual table for `Gtk::TreeViewColumn' value 
$2 = { 
    <Gtk::Object> = { 
    <Glib::Object> = { 
     <Glib::ObjectBase> = <invalid address>, 
     members of Glib::Object: 
     _vptr$Object = 0x7fff5fc06a20, 
     static object_class_ = {<No data fields>} 
    }, 
    members of Gtk::Object: 
    static object_class_ = {<No data fields>}, 
    referenced_ = 21, 
    gobject_disposed_ = 60 
    }, 
    members of Gtk::TreeViewColumn: 
    static treeviewcolumn_class_ = {<No data fields>} 
} 
(gdb) next 
152    col->set_resizable(true);   /* col = 0x0 */ 
(gdb) print col 
$3 = ('Gtk::TreeViewColumn' *) 0x0 
(gdb) print *col 
Cannot access memory at address 0x0 
(gdb) next 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
0x00000001000edc68 in Gtk::TreeViewColumn::set_resizable() 

я понятия не имею, что вызывает это явление. у тебя есть?

чтение документации. функция возвращения pcFolder отсчитывает от 1, get_column() от 0.

+0

Как выглядит `get_column`? – Nim 2010-11-30 10:51:37

+0

http://library.gnome.org/devel/gtkmm/2.22/classGtk_1_1TreeView.html#a513e50ad0acdd817d1a443f1eaa3debe – M3t0r 2010-11-30 10:57:21

ответ

3

функция:

preview->get_column(pcFolder); 

возвращает NULL.

Когда gdb показывает текущую строку кода, она не была выполнена до тех пор, пока вы не наберете следующий.

Вы, вероятно, передаете индекс, который больше числа столбцов в preview. Попробуйте:

p pcFolder 
p preview->get_columns().size() 
1
preview->get_column(pcFolder) 

должен быть возвращающегося 0.

2

preview->get_column(); возвращает NULL, до этого его просто некоторая случайная величина, так как вы не инициализировать col переменная вызова

2

Лучше код будет фактически немедленно инициализирует переменную по использованию путем вызова GetColumn в момент декларации:

TreeViewColumn *col = preview->get_column(pcFolder);

Если эта функция может возвращать NULL (как это кажется), вы должны затем проверить, прежде чем использовать указатель, таким образом:

if(col != NULL) 
{ 
    col->set_resizable(true); 
} 
// else handle the "error" if you want 
Смежные вопросы