将struct数据类型推送到向量中

时间:2016-08-02 18:38:41

标签: c++ vector data-structures ogre3d

我的结构属于

类型
     struct SegData
      {
          Ogre::Vector3 startPt;
          Ogre::Vector3 endPt;
          float r,g,b;
          float velBeg , velEnd;
      };

    SegData seg;

我有一个载体

    std::vector< SegData> temp;

我正在尝试将SegData类型的数据推回到我的矢量temp。

            seg.startPt = Ogre::Vector3(0,0,0);
            seg.endPt = Ogre::Vector3(1,1,1);
            seg.r = 1;
            seg.g = 1;
            seg.b = 1;

            temp.push_back(SegData());
            temp.push_back(seg);

我无法在向量temp中推回元素seg,导致“Segmentation fault(core dumped)”。

有人可以帮帮我吗。我不知道发生了什么。

修改

我重新启动笔记本电脑并且段错误消失了。但我得到奇怪的数组大小。我发布以下代码:

    SegData seg;
    std::vector< SegData> temp;
    zeroVec = Ogre::Vector3(0,0,0);

    posStart = Ogre::Vector3(msg->segments[j].S.position.x,msg->segments[j].S.position.y,
            msg->segments[j].S.position.z);
    posEnd = Ogre::Vector3(msg->segments[j].line.E.position.x,msg->segments[j].line.E.position.y,
            msg->segments[j].line.E.position.z);
//This is a pointer of class rviz::Line that helps plot line
    lineVisual->setPoints(posStart,posEnd);

posLeft = posStart;

    //Loop for pushing in the segData into Vector
    if(posStart!= zeroVec && posEnd!= zeroVec)
    {
        float dist = posStart.distance(posEnd);
        if (dist<1) dist = 1.0;

        if (segVec.size() == 0 || flag<id)
        {
            ROS_INFO_STREAM("INSERTING NEW ELEMENT FOR ID"<<id);  //id is passed on to this function
            segVec.push_back(std::vector<SegData> ());
            flag = id;
        }

        for(float i = 1.0; i<= int(dist); i++)
        {

            posRight.x = posStart.x+ (posEnd.x - posStart.x)*(i/dist);
            posRight.y = posStart.y+ (posEnd.y - posStart.y)*(i/dist);
            posRight.z = 0;


            posLeft = posRight;
            seg.startPt = posLeft;
            seg.endPt = posRight;
            seg.r = 1;
            seg.g = 1;
            seg.b = 1;

            temp.push_back(SegData());

            ROS_INFO_STREAM( "pushing inside temp of size  "<<temp.size());
            temp.push_back(seg);


            ROS_INFO_STREAM( "SIZE OF SEGVEC AT ID: "<<id<<" IS:  "<<segVec[id].size());
        }


        segVec.push_back(temp);

输出:

PROCESS MESSAGE
[ INFO] [1470169803.527734377]: INSERTING NEW ELEMENT FOR ID0
[ INFO] [1470169803.528113954]: pushing inside temp of size  1
[ INFO] [1470169803.528180252]: SIZE OF SEGVEC AT ID: 0 IS:  0
[ INFO] [1470169803.528206653]: pushing inside temp of size  3
[ INFO] [1470169803.528227194]: SIZE OF SEGVEC AT ID: 0 IS:  0
[ INFO] [1470169803.528250226]: pushing inside temp of size  5
[ INFO] [1470169803.528270518]: SIZE OF SEGVEC AT ID: 0 IS:  0
//For the next ID
 PROCESS MESSAGE
[ INFO] [1470169810.320975693]: INSERTING NEW ELEMENT FOR ID1
[ INFO] [1470169810.321037171]: pushing inside temp of size  1
[ INFO] [1470169810.321063642]: SIZE OF SEGVEC AT ID: 1 IS:  5030930206624027720
[ INFO] [1470169810.321093659]: pushing inside temp of size  3
[ INFO] [1470169810.321117828]: SIZE OF SEGVEC AT ID: 1 IS:  5030930206624027720
[ INFO] [1470169810.321141908]: pushing inside temp of size  5

为什么我的矢量大小会迅速扩大?

1 个答案:

答案 0 :(得分:1)

大尺寸值是如此奇怪,它必须是一些垃圾价值,而不是真正的大小。

我的第一个猜测可能是您正在使用的库的数据类型(OGRE)正在进行自定义的内存管理,例如类型Ogre::Vector3可能需要一些特定的内存对齐条件(用于性能考虑,或用于矢量化目的等)。 std::vector<SegData>使用STL的默认分配器,并且可能无法满足所需的对齐条件。

出于好奇,我搜索了一下,发现this post。所以基本上你可以尝试将STLAllocator<GeneralAllocPolicy>作为第二个模板参数(,它指定自定义分配器的类型)传递给std :: vector。这可能值得一试,只需将向量声明为:

std::vector<SegData, STLAllocator<SegData,GeneralAllocPolicy> > temp;

(在原帖中,我认为他们忘记了第二个SegData模板参数)。如果它不起作用,您可能需要检查库文档页面(f.e。this one)以查看是否应该有其他分配器或它是其他问题。

另请注意,这是一个非常常见的问题:许多库选择使用自己的内存管理策略,这可能是由于性能优化,或者仅仅是由于对齐约束。例如, Eigen (一个C ++线性代数库)库的固定大小向量必须伴随它aligned_allocator才能正确对齐(见{{3如果你对某些更多细节感兴趣的话。)

希望这可以帮到你!