Мой класс C ++ использует WinSnmp для получения целочисленного значения от устройства.
Сеанс инициализируется следующим образом:
snmpident::snmpident(const char* c, const char* si, const char* i,const char* o)
{...
sesshandle=SnmpCreateSession(NULL,NULL,snmpgetCB,this);
...}
Итак, я получаю адрес объекта класса в функции обратного вызова, который использует его для вызова метода этого объекта:
SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd, //callback func
UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData)
{...
reinterpret_cast<snmpident*>(lpClientData)->recv(sv.value.sNumber); //recv is an "snmpident" class method
...}
Как вы можете видеть, это может вызвать «нарушение доступа», если пользователь класса (в данном случае I) удаляет объект класса до того, как функция обратного вызова завершит свою работу.
Как я могу это исправить?
Sleep () выглядит безобразно. Массив структуры {pointer; session id} выглядит немного интересным, но я не уверен, что это лучший выбор.
Постскриптум Пожалуйста, прости меня за мой английский.
Задача ещё не решена.
Других решений пока нет …