C ++ / CLI Wrapper: обратный вызов запускается после удаления объектов, содержащих функцию-член - PullRequest
0 голосов
/ 24 января 2019

Моя проблема в том, что у меня есть обратный вызов, который вызывается после того, как моя основная тема удалила объект, содержащий функцию-член, которую обратный вызов хочет вызвать.Поэтому моя программа вылетает.Есть ли способ притвориться о катастрофе?Я не могу изменить поток моей основной темы.

Мой основной поток запускает новый поток для определенной задачи и ожидает в диалоговом окне.Если пользователь нажимает кнопку отмены до выполнения задачи (сканирование по Bluetooth), основная тема продолжается и удаляет объект, необходимый для обратного вызова, для вызова.

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 и внутри моей BluetoothScanCallback функции на стороне CLI, я проверяю, является ли m_bluetoothScan nullptr и, таким образом, не пытаюсь вызвать мой обратный вызов.Большое спасибо!

1 Ответ

0 голосов
/ 24 января 2019

Когда объект удален, должно быть очевидно, что вы должны позаботиться обо всех ссылках, которые используют объект.Так что, с моей точки зрения, вы также удалили любую ссылку на него.

Это означает: удаление объекта требует отмены регистрации обратного вызова.

Хорошим способом было бы использование интеллектуальных указателей на объект,так что пока существует ссылка на объект, объект не будет удален.

Вы также можете использовать сильный и слабый указатель.Таким образом, хранение слабого указателя для функции обратного вызова и сильного указателя для объекта.Таким образом, часть C ++ / CLI не способна различать, что больше нет необходимости вызывать функцию обратного вызова.

...