开发者

Pointer instantly 0x0

i have this code. the pointer turns 0x0 immediately before using it. short before, it had the correct address.

TreeViewColumn *col;
col = preview->get_column(pcFolder); /* col = 0x7fff5fc404a0 */
col开发者_开发百科->set_resizable(true);            /* col = 0x0 */

i use Gtkmm 2.4, but it returns the expected value, it just turns 0x0. whats wrong?

gdb proof:

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 ()

i have no idea what causes this phenomenon. do you have?

Solution: reading the documentation. the function returning pcFolder counts from 1, get_column() from 0.


The function call:

preview->get_column(pcFolder);

returns NULL.

When gdb shows the current code line, it hasn't been executed until you type next.

You probably pass an index that is larger than the number of columns in preview. Try:

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


preview->get_column(); returns NULL, before that, its just some random value, since you didn't initialize the col variable


Better code would actually be to initialise the variable immediately on use by calling getColumn at the point of declaration:

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

If this function can return NULL (as it appears to) you must then check before you use the pointer, thus:

if( col != NULL )
{
   col->set_resizable( true );
}
// else handle the "error" if you want


preview->get_column(pcFolder)

must be returning 0.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜