在過去的幾天中,調試了一個多線程,其中一個線程正在刪除一個仍在被另一個線程使用的對象,我意識到如果我能夠使這個變量變得更易於診斷,問題會變得更加容易和快速。它會將系統(Symbian OS)上的崩潰轉儲更改爲更多的信息。爲什麼'這'不易變?
那麼,有什麼理由不能或不應該這樣嗎?
編輯: 所以真的沒有安全的方法來防止或檢查這種情況。如果說一個訪問過時類指針的解決方案是擁有一個包含指針的全局變量,並且所調用的任何函數都應該是使用全局變量作爲「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的值,而不是每次使用時檢查它。
你的意思是說,如果this是易失性的,它會更容易,或者如果this是一個指向volatile的指針,它會更容易?換句話說,你是否在崩潰轉儲中看到'this'的過期值(這看起來有點奇怪,因爲它從不改變),或者某些數據成員? –