0

我有一个视频 C++ 回调函数,其中参数在几个小时后突然改变。在调试中,它将对此断言:

void CCameraInstance::VideoCallback(void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)
{
   assert(nWidth < 4000);
   CCameraInstance *pThis = (CCameraInstance*)pContext;
   pThis->PaintFrame(pBuffer, nWidth, nHeight, nFrameErrorNo);
}

当调试器在断言上中断时,nWidth 具有很大的无效值。但是,nHeight 是 320(宽度值),nFrameErrorNo 是 240(nHeight 值)。

参数如何以这种方式发生变化?

4

1 回答 1

0

这种转变可能是由隐藏的 this 指针引起的。http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

从您在此处粘贴的代码

void CCameraInstance::VideoCallback(void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)

我可以看到回调函数是一个成员class CCameraInstance

我不确定您是将函数定义为静态函数还是普通函数。但理论上它应该是一个静态函数来避免this指针。使用 C++ 类成员函数作为 C 回调函数

但是,即使我已将成员函数定义为静态,我也遇到了 C++/CLI 的问题。this 指针/句柄仍然存在。

我认为您可以尝试将您的功能定义为

void CCameraInstance::VideoCallback(CCameraInstance* test,void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)

并试一试。

如果您使用的是 C++/CLI,它将是

void CCameraInstance::VideoCallback(CCameraInstance^ test,void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)
于 2016-05-14T09:07:52.880 回答