我目前正在尝试在一个方法中插入数据,然后将其添加到向量中。出于某种原因,当我到达输入第二组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
是常规设置方法。
修改
好吧,我刚发现造成分段错误的线路。
它是我的setName
方法
void ShapeTwoD::setName(string name) {
this->name = name;
}
EDIT2
根据要求,这是名称和形状的定义。是的,sq是Square
类的指针。
内部驱动程序类:
string shape;
在ShapeTwoD类中:
class ShapeTwoD {
private:
string name;
bool containsWarpSpace;
double area;
};
知道为什么会导致这个错误?
答案 0 :(得分:5)
是否可能没有初始化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。
答案 1 :(得分:0)
您正在将字符串传递给setName(字符串名称)函数,该函数默认为按值传递。您将其指定为引用,因为您使用指针运算符将成员数据名称称为this-&gt; name。我想这可能就是你遇到段错误的原因。确保ShapeTwoD中的字符串名称不是指针,并且不将其称为一个指针。还要检查传入函数的字符串形状是否也未声明为指针。
答案 2 :(得分:0)
我认为形状是
vector<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;
}