Потратив последние несколько дней на отладку многопоточности, когда один поток удалял объект, который все еще используется другим, я понял, что проблему было бы гораздо проще и быстрее диагностировать, если бы я мог сделать «это» летучий. Это изменило бы аварийный дамп в системе (ОС Symbian) на что-то гораздо более информативное.
Итак, есть ли причина, по которой этого не может быть или не должно быть?
Изменить: Так что действительно нет безопасного способа предотвратить или проверить этот сценарий. Было бы правильно сказать, что одно из решений для доступа к устаревшим указателям классов состоит в том, чтобы иметь глобальную переменную, которая содержит указатель, а любые вызываемые функции должны быть статическими, которые используют глобальную переменную в качестве замены для 'this'?
static TAny* gGlobalPointer = NULL;
#define Harness static_cast<CSomeClass*>(gGlobalPointer);
class CSomeClass : public CBase
{
public:
static void DoSomething();
private:
int iMember;
};
void CSomeClass::DoSomething()
{
if (!Harness)
{
return;
}
Harness->iMember = 0;
}
Таким образом, если другой поток удалит глобальный указатель и присвоит ему NULL, он будет немедленно пойман.
Я думаю, что одна проблема заключается в том, что если компилятор кэширует значение Harness вместо того, чтобы проверять его каждый раз при его использовании.