0

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

知道为什么这会导致故障吗?

4

3 回答 3

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。

于 2013-11-05T19:14:43.947 回答
0

我假设形状是

vector<ShapeTwoD*>;

如果是这种情况,即使没有段错误,您的代码也不会执行您想要的操作。

您将相同的指针推ShapeTwoD*送到向量形状,因此,该向量中的所有条目都将指向相同的内存位置,它们都将等于您推送到向量的最后一个 sq。

改用 a vector<ShapeTwoD>或确保new ShapeTwoD()每次要将新条目推送到形状时都分配 a 。所以

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;
}
于 2013-11-05T19:24:19.583 回答
0

您正在将一个字符串传递给 setName(string name) 函数,该函数默认按值传递。但是,您将其分配为引用,因为您使用指针运算符将成员数据名称称为 this->name。我认为这可能就是您遇到段错误的原因。确保 ShapeTwoD 中的字符串名称不是指针,并且不要将其称为指针。还要检查您传递给函数的字符串形状是否也未声明为指针。

于 2013-11-05T18:38:13.743 回答