2010-05-07 24 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]; 

Các struct ptr được sử dụng như một danh sách liên kết. Nhưng khi tôi gỡ lỗi mã trong gdb, tôi thấy rằng ptr * đã được chuyển đổi thành void *.
GDB đầu ra:C++: tại sao một con trỏ tự của một struct tự động thay đổi để làm mất hiệu lực *

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

Tuy nhiên, tôi vẫn có thể xem dữ liệu của struct nếu tôi bí mật chúng trở lại ptr * trong gdb.
Lý do cho việc này là gì?

Tôi đang sử dụng Arch Linux, GNOME, g ++ 4.5.0, gdb 7.1. Không có cờ biên dịch nào nhưng a -g.
This GDB was configured as "i686-pc-linux-gnu"

+0

Nó hiển thị 'ptr *' trên hệ thống của tôi. Bạn đã sử dụng những cờ biên dịch nào? Phiên bản nào của g ++ và gdb? – Thomas

+0

Lạ, tôi cũng sử dụng gdb 7.1, nhưng g ++ 4.4.3. Ghi chú phát hành 4,5 không gợi ý bất kỳ sự thay đổi nào theo hướng này. http://gcc.gnu.org/gcc-4.5/changes.html – Thomas

+0

Chỉ cần điền vào một số điểm dữ liệu khác, sử dụng gdb 7.0.1 tôi nhận được câu trả lời đúng với g ++ 4.2.4 và 4.3.3 nhưng với 4.5. 0 gdb hiển thị con trỏ dưới dạng 'void *'. Hình như một lỗi trong gcc (hoặc gdb?) –

Trả lời

1

Tác phẩm tốt cho tôi trên OS X.

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

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

phiên bản gdb:

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

Nó nên được đề cập rằng "ptr" là/không/một con trỏ thông minh, nó chỉ là một cấu trúc, một trong đó thậm chí không có một destructor.

(Con trỏ thông minh có ý nghĩa rất chính xác trong đất C++)

+0

Vâng, tôi rất tiếc vì điều đó. Tôi không nên nói "một con trỏ thông minh" ở đây với một sự hiểu biết mơ hồ về chúng. Văn bản đã được sửa ngay bây giờ. – Stone

+0

Không làm hại. :) – Arafangion

Các vấn đề liên quan