簡體   English   中英

在C ++中出現分段錯誤,但是為什么呢?

[英]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::addelse子句中,您未設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM