首页 > 解决方案 > C++/CLI Wrapper:在删除包含成员函数的对象后触发回调

问题描述

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

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

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

更新:

就像@xMRi 指出的那样,我必须在我的析构函数中取消注册我的回调。我所做的是,在 CLI 端设置我callback_function的 tonullptr和内部BluetoothScanCallback函数,我检查是否m_bluetoothScannullptr,因此不要尝试调用我的回调。非常感谢!

标签: c++callbackc++-cli

解决方案


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

这意味着:删除对象需要取消注册回调。

一个好的方法是使用指向对象的智能指针,所以只要有对象引用,对象就不会被删除。

您还可以使用强指针和弱指针。所以存储回调函数的弱指针和对象的强指针。所以 C++/CLI 部分能够区分不再需要调用回调函数。


推荐阅读