insert(std::map<int,struct>) 分段错误(核心转储)

insert(std::map<int,struct>) segmentation fault (core dumped)

本文关键字:分段 核心 转储 gt 错误 int map std lt insert struct      更新时间:2023-10-16

我的c++代码的一个简单部分有问题,这里是问题:我有一个相当大的程序运行一些SLAM的东西(所有工作完美),但我似乎看不出我的代码的一小部分有什么问题。我有一个名为polygon的结构体,它由点数组(这是一个不同的结构体)和数组中点的数量组成。

struct point
{
    float x;
    float y;
    float z;
    point(float X, float Y, float Z) {x=X; y=Y; z=Z;};
    point() {x=0; y=0; z=0;};
};
struct ray
{
    point R1;
    point R2;
    ray(point r1,point r2) {R1=r1; R2=r2;};
    ray(){R1=point(); R2=point();};
};
struct polygon
{
    point P[];
    int count=0;
    polygon(){};
};

当我运行下面的代码时,我得到一个分段错误,在编译中没有错误。你觉得会是什么?是我没有正确定义地图value_type吗?我只是花了几个小时试图解决这个问题,但没有成功。感谢

polygon psdfs;
*psdfs.P = *new point[4];
psdfs.P[0] = point(100,0,100);
psdfs.P[1] = point(-100,0,100);
psdfs.P[2] = point(-100,0,-100);
psdfs.P[3] = point(100,0,-100);
psdfs.count = 4;
polygons->insert(pair<int, polygon>(0,psdfs));

polygons

std::map<int, polygon > * polygons;

point P[]并不像你想象的那样。我不完全确定它在这种情况下是否有效,但如果是,那么它与point * P相同。

所以你最多有一个需要初始化的指针

你可能认为*psdfs.P = *new point[4]做到了这一点,但它没有。这是无效的,但如果它是,它将是一个值/复制赋值从一个数组到一个数组…但是你没有一个数组,你有一个指针,谁知道是什么。

你真正想要的是psdfs.P = new point[4]

现在所有这些都只是技术上的,让它在你的代码中起作用。另一个问题是,你的类的设计非常糟糕。你不应该像这样进入类并操纵它们,尤其是初始化数组——这应该在构造函数中完成。

我建议使用std::vector而不是new[]分配。我将使变量私有,并有函数添加点到多边形。至少我认为你应该做到这两件事。