2010-10-01 54 views
1

這可能是一個愚蠢的錯誤,但它驅使我嘗試修復它。向量push_back訪問衝突

我有一個結構:

struct MarkerData 
{ 
int pattId; 
unsigned short boneId; 
Ogre::Matrix4 transToBone; 
Ogre::Vector3 translation; 
Ogre::Quaternion orientation; 

MarkerData(int p_id, unsigned short b_id, Ogre::Matrix4 trans) 
{ 
    pattId = p_id; 
    boneId = b_id; 
    transToBone = trans; 
} 
}; 

和A類:

class TrackingSystem 
{ 
public: 
    void addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone); 

private: 
    std::vector <MarkerData> mMarkers; 
}; 

現在,在addMarker方法:

void TrackingSystem::addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone) 
{ 
    mMarkers.push_back(MarkerData(pattId,boneId,transToBone)); 
} 

這的push_back會導致訪問衝突「未處理的異常在OgreAR.exe 0x00471679:0xC0000005:訪問衝突讀取位置0x00000018「。

作爲一個測試,我嘗試這樣做:

void TrackingSystem::addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone) 
    { 
     std::vector <MarkerData> test; 
     test.push_back(MarkerData(pattId,boneId,transToBone)); 
    } 

這工作得很好。

我在做什麼錯?謝謝!

+0

你能抓住這個例外,找出它到底是什麼嗎?這可能會導致你正確的答案。 – Starkey 2010-10-01 14:55:04

回答

6

機會是很高,你打電話addMarker在其上TrackingSystem對象是死的(並且this指針是無效的。它要麼出去的範圍,刪除被過早調用,或者它從來就沒有正確創建(指針仍然是空)。

這是更可能因爲的push_back到本地矢量正常工作。

1

只是爲了調試,試

void TrackingSystem::addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone) 
{ 
    MarketData m(pattId, boneId, transToBone); 
    mMarkers.push_back(m); 
} 

然後用調試器在那裏得到的,看看到底是怎麼回事。這可能是因爲你在其他地方發生了內存損壞,並且當你進入這個函數調用時,TrackingSystem的這個實例有一個損壞的mMarkers矢量。

+0

感謝您的幫助! 只要在調試器中查看addMarker中'this'的值就是0.這樣不好嗎?! – Jack 2010-10-01 15:06:41

3

這一點,如果你正在做的事情一樣

TrackingSystem* p = new TrackingSystem(); 
delete p; //or p = 0, or anything that makes p not point to the object anymore 
p->AddMarker(0, 0, Ogre::Matrix4()); 

或者更簡單通常會發生

TrackingSystem* p; 
p->AddMarker(0, 0, Ogre::Matrix4()); 

BTW它可能是更好的傳遞第三個參數爲const引用,以避免不必要的副本。

0

這些只是根據的猜測提供的信息。

  1. MarkerData ctor不初始化翻譯或方向,所以它們將被默認初始化。這足夠嗎? (順便說一下,使用該ctor中的成員初始化列表而不是賦值,並通過const引用而不是按值傳遞該Matrix4對象。)

  2. ceretullis有一個很好的建議。在問題中發佈代碼後,您確實無法確定在構建臨時MarkerData對象期間或在執行push_back調用期間是否發生崩潰。

  3. 基於「訪問衝突讀取位置0x00000018」。這可能是因爲有一個空指針被解引用的地方。您沒有看到足夠的代碼來查看空指針的位置,或者它可能位於Ogre庫中的某處。

  4. 您的測試表明存在與堆棧有關的問題。當您在堆棧中聲明矢量而不是作爲成員變量時,它會更改堆棧框架的佈局。創建的臨時MarkerData也在堆棧上創建。如果你在測試中沒有問題,那可能是因爲堆棧佈局的不同 - 也許在MarkerData的複製構造函數中存在一些緩衝區溢出,在您的示例中這將會被調用幾次。

0

你打電話的方式是TrackingSystem::addMarker()

任何機會是通過NULL(或以其他方式僞造)TrackingSystem*

2

對不起,原來我是一個木偶。在調用addMarker之前,我的TrackSystem實例未初始化。

道歉爲時間浪費!