C++/CLI Wrapper:在删除包含成员函数的对象后触发回调

C++/CLI Wrapper: callback gets fired after the objects containing the memberfunction is deleted

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

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

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 指出的那样,我不得不在我的析构函数中注销我的回调。我所做的是,将我的 callback_function 设置为 nullptr 并在 CLI 端的 BluetoothScanCallback 函数内,我检查 m_bluetoothScan 是否为 nullptr,因此不要不要尝试拨打我的回调。非常感谢!

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

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

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

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