2

这可能是一个愚蠢的错误,但它让我疯狂地试图修复它。

我有一个结构:

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;
 }
};

还有一个类:

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));
    }

这工作正常。

我究竟做错了什么?!谢谢!

4

6 回答 6

7

TrackingSystem您调用的对象addMarker很有可能已死(并且this指针无效。它超出范围,delete 被过早调用,或者它从未正确创建(指针仍然为空)。

这更有可能是因为 push_back 到本地向量工作正常。

于 2010-10-01T15:07:21.067 回答
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() );

顺便说一句,最好将第三个参数作为 const 引用传递以避免不需要的副本。

于 2010-10-01T15:06:20.740 回答
2

对不起,原来我是个布偶。在调用 addMarker 之前,我的 TrackSystem 实例未初始化。

为浪费时间而道歉!

于 2010-10-01T15:15:25.470 回答
1

只是为了调试,试试

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

然后使用调试器进入那里,看看发生了什么。可能是您在其他地方发生了内存损坏,并且当您进入此函数调用时,TrackingSystem 的此实例具有损坏的 mMarkers 向量。

于 2010-10-01T14:55:56.527 回答
0

这些只是基于提供的信息的猜测。

  1. MarkerData ctor 不会初始化平移或方向,因此它们将被默认初始化。这够吗?(顺便说一句,使用该ctor中的成员初始化列表而不是赋值。并通过常量引用而不是值传递该Matrix4对象。)

  2. ceretullis 有一个很好的建议。使用问题中发布的代码,您真的无法确定崩溃是在构建临时 MarkerData 对象期间还是在 push_back 调用期间发生的。

  3. 基于“访问冲突读取位置 0x00000018”。这可能是因为某处有一个空指针被取消引用。您没有显示足够的代码来查看该空指针可能在哪里,或者它可能在 Ogre 库中的某个地方。

  4. 您的测试表明存在与堆栈相关的问题。当您在堆栈上声明向量而不是作为成员变量时,它会更改堆栈框架的布局。创建的临时 MarkerData 也在堆栈上创建。如果您所做的那个测试没有问题,那可能是因为堆栈布局的不同——也许 MarkerData 的复制构造函数中存在一些缓冲区溢出,在您的示例中会调用几次。

于 2010-10-01T15:08:20.330 回答
0

你怎么叫TrackingSystem::addMarker()

是否有机会通过 NULL (或其他虚假)TrackingSystem*

于 2010-10-01T15:11:05.907 回答