2016-08-02 99 views
1

我的結構類型推結構數據類型爲載體

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

    SegData seg; 

我有

std::vector< SegData> temp; 

我試圖型SegData的數據推回我的矢量臨時的向量。

  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並導致「分段錯誤(核心轉儲)」。

有人可以幫我在這裏。我不知道發生了什麼事。

編輯

我重新啓動我的筆記本電腦和段錯誤消失。但我得到奇怪的數組大小。我張貼下面的代碼:

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 

爲什麼我的矢量大小迅速擴大?

+0

你確定它不是'temp.push_back(SegData());'是否導致了這個問題? – ArchbishopOfBanterbury

+0

我不確定。我認爲這是我們應該推新的結構元素。那是錯的嗎? – Greatgoing

+3

註釋掉這條線,看看是否仍然出現分段錯誤,可能是默認構建'Ogre :: Vector3'對象的問題,但我不確定,因爲我不知道它們是什麼。 – ArchbishopOfBanterbury

回答

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)以查看是否應該有其他分配器或者是其他問題。另外請注意,這是一個相當常見的問題:許多庫選擇使用自己的內存管理策略,要麼是由於性能優化,要麼是由於對齊限制。例如,爲了正確對齊(如果您對某些細節感興趣,請參見here),其固定大小的向量必須伴隨着它的aligned_allocator(如果您對某些細節感興趣,請參見here)。

希望這能幫助你!