簡體   English   中英

插入數據時出現分段錯誤

[英]Segmentation fault when inserting data

我目前正在嘗試在一種方法中插入數據,然后將其添加到向量中。 由於某種原因,當我到達輸入第二組x y的點時,總是會遇到分割錯誤。

我認為這是導致故障的部分:

    if (shape == "square") {
    for (int i = 0; i < 4; i++) {
        cout << "Please enter x-coordinate of pt." << i+1 << " : ";
        cin >> x;
        cout << "Please enter y-coordinate of pt." << i+1 << " : ";
        cin >> y;

        sq->setName(shape);
        sq->setContainsWarpSpace(type);
        sq->setVertices(i,x,y);

        shapes.push_back(sq);
    }
}

setNamesetContainsWarpSpace是常規的set方法。

編輯
好吧,我剛剛找到了導致分段錯誤的行。 它是我的setName方法

void ShapeTwoD::setName(string name) {
this->name = name;
} 

EDIT2
根據要求,這是名稱和形狀的定義。 是的,sq是Square類的指針。

內部驅動程序類:

string shape;

內部ShapeTwoD類:

class ShapeTwoD {
private:
string name;
bool containsWarpSpace;
double area;
};

知道為什么這會導致故障嗎?

sq指針是否可能未初始化,因為這似乎是問題所在。 如果我編寫並執行以下命令:

#include <string>
#include <iostream>
using namespace std;

class A
{
private:
    string name;
public:
    void SetName(string name)
    {
        this->name = name;
        cout<<this->name<<endl;
    }
};

int main()
{
    A* obj = new A();
    obj->SetName("test");
    return 0;
}

該代碼可以編譯並完美執行。 但是,如果我更改了這一行:

A* obj = new A();

有:

A* obj = NULL;

然后我得到了SEGFAULT。

您正在將字符串傳遞給setName(string name)函數,該函數默認按值傳遞。 但是,您將其分配為引用,因為使用指針運算符將成員數據名稱引用為this-> name。 我認為這可能就是為什么您遇到段錯誤。 確保ShapeTwoD中的字符串名稱不是指針,並且不要將其引用為一個。 還要檢查傳遞給函數的字符串形狀是否也未聲明為指針。

我認為形狀是

vector<ShapeTwoD*>;

在這種情況下,即使代碼沒有段錯誤,您的代碼也不會執行您想要的操作。

您將ShapeTwoD*的相同指針ShapeTwoD*矢量形狀,結果,該矢量中的所有條目將指向相同的存儲位置,它們均等於您推向矢量的最后一個平方。

請改用vector<ShapeTwoD>或確保每次要將新條目推送到形狀時都分配一個new ShapeTwoD() 所以

vector<ShapeTwoD> shapes;
sd->setName(name);
... 
shapes.push_back(*sd);

要么

vector<ShapeTwoD*> shapes;
ShapeTwoD* newSd = new ShapeTwoD();
newSd->setName(name);
... 
shapes.push_back(newSd);

如果選擇使用矢量,別忘了在完成形狀后釋放形狀中的內存

for(vector<ShapeTwoD*>::iterator it = shapes.begin(); it != shapes.end(); it++){
   delete *it;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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