插入数据时出现分段错误

时间:2013-11-05 18:16:25

标签: c++ vector

我目前正在尝试在一个方法中插入数据,然后将其添加到向量中。出于某种原因,当我到达输入第二组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是常规设置方法。

修改
好吧,我刚发现造成分段错误的线路。 它是我的setName方法

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

EDIT2
根据要求,这是名称和形状的定义。是的,sq是Square类的指针。

内部驱动程序类:

string shape;

在ShapeTwoD类中:

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

知道为什么会导致这个错误?

3 个答案:

答案 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;
}