Почему 'this' не является изменчивым?

Потратив последние несколько дней на отладку многопоточности, когда один поток удалял объект, который все еще используется другим, я понял, что проблему было бы гораздо проще и быстрее диагностировать, если бы я мог сделать «это» летучий. Это изменило бы аварийный дамп в системе (ОС 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 вместо того, чтобы проверять его каждый раз при его использовании.

5
задан James 1 July 2011 в 10:29
поделиться