[英]Getting Segmentation Fault in C++, but why?
我在此代碼中出現分段錯誤,但我不知道為什么。 我知道當指針為NULL或指向隨機內存地址時會發生分段錯誤。
q = p;
while(q -> link != NULL){
q = q -> link;
}
t = new data;
t -> city = cityName;
t -> latitude = lat;
t -> longitude = lon;
q -> link = t;
這實際上是控制台中出現的錯誤:
line 33: 2219 Segmentation fault sh "${SHFILE}"
在Database::add
的else
子句中,您未設置t->link = NULL
,因此未初始化。
您應該為初始化其成員的data
添加一個構造函數,或者使用值初始化的new
來確保正確初始化所有內容:
t = new data(); // note the parentheses
可能是因為要將新節點添加到列表的末尾:
else{
q = p;
while(q -> link != NULL){
q = q -> link;
}
t = new data;
t -> city = cityName;
t -> latitude = lat;
t -> longitude = lon;
q -> link = t;
}
您沒有設置t->link = NULL;
。
您沒有在Database::add
Database :: data :: link設置為NULL
:
t = new data;
t -> city = cityName;
t -> latitude = lat;
t -> longitude = lon;
t -> link = NULL;
編輯 :我將為Database::data
添加一個構造函數以初始化各種成員。 就像是:
class Database {
struct data {
data(): latitude(0.0), longitude(0.0), link(NULL) {}
...
};
...
};
這樣就不必擔心未初始化的內存。
使用-g作為g ++的參數進行編譯
然后從命令行“ gdb(二進制名稱)”
在gdb內,“運行”,它將執行直到故障
輸入“ bt”以查看堆棧跟蹤
可能還有其他問題,但這是一個問題:
else{
q = p;
while(q -> link != NULL){
q = q -> link;
}
t = new data;
t -> city = cityName;
t -> latitude = lat;
t -> longitude = lon;
q -> link = t;
}
您永遠不會將t->link
設置為null,因此它充滿了垃圾。
您需要將t的鏈接分配為NULL:
else{
q = p;
while(q -> link != NULL){
q = q -> link;
}
t = new data;
t -> city = cityName;
t -> latitude = lat;
t -> longitude = lon;
t -> link = NULL; // add this
q -> link = t;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.