2010-05-07 3 views
5
struct ptr{ 
    int node; 
    ptr *next; 
    ptr(){} 
    ptr(int _node, ptr *_next){ node=_node; next=_next; } 
}; 
struct list_t{ 
    ptr *sht; 
    int size; 
    void push(int node){ 
     size++; 
     sht=new ptr(node,sht); 
    } 
}shthead[100001], comp[200001], tree[200001]; 

Die Struktur ptr als verkettete Liste verwendet wird. Aber wenn ich den Code in gdb debugge, stellte ich fest, dass die ptr * 's alle in void * konvertiert wurden.
GDB Ausgang:C++: warum ein Selbst Zeiger einer Struktur automatisch auf void * ändert

(gdb) pt ptr 
type = struct ptr { 
    int node; 
    void *next; 
    public: 
    ptr(void); 
    ptr(int, void *); 
}

Ich kann aber noch die Daten der Struktur sehen, ob ich sie ptr verdeckte zurück * in gdb.
Was ist der Grund dafür bitte?

Ich benutze Arch Linux, GNOME, g ++ 4.5.0, gdb 7.1. Ohne irgendwelche Kompilierungsflags, aber ein -g.
This GDB was configured as "i686-pc-linux-gnu"

+0

Es zeigt 'ptr *' auf meinem System. Welche Compilier-Flags hast du benutzt? Welche Version von g ++ und gdb? – Thomas

+0

Seltsam, ich benutze auch gdb 7.1, aber g ++ 4.4.3. Die Releaseinformationen von 4.5 geben keinerlei Hinweis auf eine Änderung in dieser Richtung. http://gcc.gnu.org/gcc-4.5/changes.html – Thomas

+0

Nur um mehr Datenpunkte mit gdb 7.0.1 auszufüllen. Ich bekomme die richtige Antwort mit g ++ 4.2.4 und 4.3.3 aber mit 4.5. 0 gdb zeigt den Zeiger als 'void *'. Sieht aus wie ein Fehler in gcc (oder gdb?) –

Antwort

1

Funktioniert bei mir auf OS X. Fein

(gdb) pt ptr 
type = class ptr { 
    public: 
    int node; 
    ptr *next; 

    ptr(void); 
    ptr(int, ptr *); 
} 

GDB Version:

Shadow:code dkrauss$ gdb -v 
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin". 
0

Es sollte erwähnt werden, dass "ptr" ist/nicht/ein intelligenter Zeiger, es ist nur eine Struktur, eine, die nicht einmal einen Destruktor hat.

(Smart-Pointer hat eine sehr genaue Bedeutung in C++ Land)

+0

Nun, das tut mir ziemlich leid. Ich hätte hier nicht "einen klugen Zeiger" mit einem vagen Verständnis von ihnen sagen sollen. Der Text wurde jetzt korrigiert. – Stone

+0

Kein Schaden angerichtet. :) – Arafangion