我的问题是,我有一个回调,该回调在主线程删除包含该回调要调用的成员函数的对象后被调用。因此,我的程序崩溃了。有什么办法假装坠机吗?我无法更改主线程的流程。
我的主线程为特定任务启动一个新线程,并在对话框中等待。如果用户在完成任务(蓝牙扫描)之前按“取消”,则主线程将继续并删除回调所需的对象以进行调用。
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
,因此不要尝试调用我的回调。非常感谢!
答案 0 :(得分:2)
删除对象后,很明显,您必须注意使用该对象的所有引用。因此,从我的角度来看,您也删除了对其的任何引用。
这意味着:删除对象需要注销回调。
一种好的方法是使用指向对象的智能指针,因此只要有对象引用,就不会删除该对象。
您还可以使用强指针和弱指针。因此,为回调函数存储一个弱指针,为该对象存储一个强指针。因此,C ++ / CLI部分能够区分不再需要调用回调函数。