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部分已经能够区分,不再需要调用回调函数了。
我的问题是,我有一个回调,在我的主线程删除了包含回调要调用的成员函数的对象后被调用。因此,我的程序崩溃了。有什么办法,假装崩溃?我无法更改主线程的流程。
我的主线程为特定任务启动一个新线程并在对话框中等待。如果用户在任务(蓝牙扫描)完成之前按下取消,主线程将继续并删除回调所需的对象,以调用。
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部分已经能够区分,不再需要调用回调函数了。