1
我正在嘗試調試一個程序,它似乎與指針傳遞有關。我有一個類定義如下:稱取一個指向數據對象gdb:當一個變量重置時發生中斷
class data{
public:
data(int x, int y){
a=x;
b=y;
md = new metadata();
}
~data(){
delete md;
}
int a;
int b;
metadata* md; //metadata is another class
};
和幾個功能:
void function1(data* d){
//do stuff
}
void function2(data* d){
//do stuff
function1(d);
}
void function3(data* d){
//do stuff
function2(d);
}
int main(){
//stuff
data* data = new data(1,2);
function3(d);
//other stuff
}
我有一個斷點function1
和一個在function3
設置。在這兩個斷點之間的某處,md
被重新分配爲指向不同的元數據對象(d
,但仍指向相同的內存地址)。在這兩個斷點之間有數千行執行,所以它不太可行,所以我想在指針改變時觀察和中斷。然而,watch d->md
爲function1
的breakboint不工作,因爲我得到一個消息說
Watchpoint 1 deleted because the program has left the block in which its expression is valid
這大概是因爲在d
是本地功能的情況下。有沒有辦法看到內存地址的指針存儲在哪裏,看看它何時被改變(即當md
被重新分配)並在那裏破?
我不再收到'Watchpoint deleted'錯誤,但現在當我嘗試繼續時程序凍結。任何想法爲什麼? – ewok
嘗試觀看不同的表達式,例如通過地址查看d-> md的成員的值,例如獲取d-> md-> some_member的地址。也許MD不會改變,但價值觀正在改變。 – perreal
也試試valgrind – perreal