[英]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);
}
}
setName
和setContainsWarpSpace
是常規的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.