C ++ / CLI包装器:删除包含成员函数的对象后,将触发回调

时间:2019-01-24 11:35:49

标签: c++ callback c++-cli

我的问题是,我有一个回调,该回调在主线程删除包含该回调要调用的成员函数的对象后被调用。因此,我的程序崩溃了。有什么办法假装坠机吗?我无法更改主线程的流程。

我的主线程为特定任务启动一个新线程,并在对话框中等待。如果用户在完成任务(蓝牙扫描)之前按“取消”,则主线程将继续并删除回调所需的对象以进行调用。

function-call: 84ms 
in-function: 596ms

更新:

就像@xMRi指出的那样,我必须在析构函数中注销我的回调。我所做的是,将typedef std::tr1::function<void __cdecl ()>* callback_function; callback_function m_bluetoothScan = //Some function in native C++ // The c++/cli callback void Connection::BluetoothScanCallback(IAsyncResult^ ar) { if (m_bluetoothScan != nullptr) { (*m_bluetoothScan)(); // The native c++ member function } } 设置为callback_function,并在CLI端的nullptr函数内部,我检查BluetoothScanCallback是否为m_bluetoothScan,因此不要尝试调用我的回调。非常感谢!

1 个答案:

答案 0 :(得分:2)

删除对象后,很明显,您必须注意使用该对象的所有引用。因此,从我的角度来看,您也删除了对其的任何引用。

这意味着:删除对象需要注销回调。

一种好的方法是使用指向对象的智能指针,因此只要有对象引用,就不会删除该对象。

您还可以使用强指针和弱指针。因此,为回调函数存储一个弱指针,为该对象存储一个强指针。因此,C ++ / CLI部分能够区分不再需要调用回调函数。