C++/CLI 包装器 : callback gets fired after the objects containing the memberfunction is deleted

标签 c++ callback c++-cli

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

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

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_bluetoothScannullptr 因此不要尝试调用我的回调。非常感谢!

最佳答案

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

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

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

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

关于C++/CLI 包装器 : callback gets fired after the objects containing the memberfunction is deleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54345713/

相关文章:

c++ - 按值从 vector 中删除元素 - C++

c++ - 从字符串中读取整数

windows - 在 const 引用上调用属性

c++ - IOServiceAddMatchingNotification 问题

java - Java 匿名回调类的 C++11 替代方案

c++-cli - 使用 Marshal::GetFunctionPointerForDelegate 并从非托管代码调用回调会导致退出应用程序时缓冲区溢出

c - 使用 hashmap 从数组中删除重复条目

c++ - 如何在函数内部创建一个数组,然后使用该数组创建另一个数组?

c++ - 不使用configure_file时如何使用CMake生成C++代码?

c - 在 C 中注册回调函数是什么意思?