c++ - 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_bluetoothScan
是nullptr
,因此不要尝试调用我的回调。非常感谢!
解决方案
当对象被删除时,很明显您必须注意所有使用该对象的引用。因此,从我的角度来看,您还删除了对它的任何引用。
这意味着:删除对象需要取消注册回调。
一个好的方法是使用指向对象的智能指针,所以只要有对象引用,对象就不会被删除。
您还可以使用强指针和弱指针。所以存储回调函数的弱指针和对象的强指针。所以 C++/CLI 部分能够区分不再需要调用回调函数。
推荐阅读
- amazon-web-services - 执行 Jenkins 文件时,'scp' 未被识别为内部或外部命令
- android - 当我在点击布局问题上设置:isEnabled:false 时,Nativescript 按钮在点击时显示文本背景颜色
- javascript - 在表格中获取图像时在图像标签中设置高度和宽度
- r - 汇总团队成员得分的平均分
- swift - Swift 4.2 - 类型附近的 __shared 属性
- ruby - regex match and split in ruby
- javascript - WooCommerce:在编辑订单上禁用日期
- regex - 我想知道如何在 Google Big 查询中执行 CONNECT BY REGEXP
- python - 训练模型时多次训练小数据和一次训练大数据有区别吗?
- python - listA.append(listB[:]) 和 listA.append(listB) 有什么区别?