从不同的 cpp 调用回调函数会导致 bad_function_call

Posted

技术标签:

【中文标题】从不同的 cpp 调用回调函数会导致 bad_function_call【英文标题】:Calling Callback function from different cpp causes bad_function_call 【发布时间】:2020-02-01 18:14:11 【问题描述】:

我目前正在开发一个 OpenCV 项目,我想从不同的 cpp 调用 main.cpp 中的回调函数。 我面临的问题是,当我想调用该函数时,我得到一个 bad_function_call,因为回调函数为空。

我的 main.cpp 看起来像这样:

 PointDetection *detect;
 detect->houghCallback = [hPublisher] (std::vector<cv::Vec4i> data) 
        //do something
 ;

我的 PointDetector.hpp,它包含在 PointDetector.cpp 中:

 std::function <void (std::vector<cv::Vec4i> data) houghCallback;

我的 PointDetector.cpp,我调用函数的地方如下所示:

 void PointDetector::houghDetectCb(int status, void *userData) 
        std::vector<cv::Vec4i> houghPointsResult;
        PointDetector *self = static_cast<PointDetector *>(userData);    //This includes every variable in the hpp except the houghCallback for some reason 
        self->houghCallback(houghPointsResult);                          //This causes the bad_function_call because houghCallback is Null 
 

有人知道是否可以这样调用回调吗?

【问题讨论】:

我的猜测是,self 是一个悬空指针,指向一个已经被销毁的对象。问题出在未显示的代码中。显示minimal reproducible example @IgorTandetnik 我找到了解决方案,请参阅我的答案 【参考方案1】:

我找到了解决方案:我在实际 GPU 操作之前调用了 stream.enqueqeHostCallback(请参阅此问题:cuda streams: callback not getting called after stream execution)

【讨论】:

以上是关于从不同的 cpp 调用回调函数会导致 bad_function_call的主要内容,如果未能解决你的问题,请参考以下文章

我可以从内部暂停回调吗?

JNI - 在本机 cpp 回调函数中使用 RxJava 的奇怪行为

如何用简单的英语解释回调?它们与从另一个函数调用一个函数有何不同?

cpp►变参函数与回调函数

使用 jQuery 中止 JSONP ajax 请求

从事件处理程序回调调用的函数中“this”的值?