サードパーティ ライブラリ (QtPropertyBrowser for Qt 5.0) の新しいバージョンにアップグレードしました。アップグレードにより、アプリケーションに新しいバグが発生し、ライブラリ内の静的関数を追跡することができました。関数には、関数が最初に呼び出されたときに初期化される静的変数が含まれています。初期化後にその変数のメモリ位置をコピーしたところ、予想どおり、その後の複数の呼び出しで変数が同じメモリ位置に残っていることがわかりました。次に、後続の関数呼び出しで、静的変数のメモリ位置とデータが変更されたことに気付きました (プログラムにバグが発生しました)。
コードは次のようになります。
class ClassA
{
//....
};
class ClassB
{
public:
ClassA* ptrMember;
};
static ClassA *theFunction()
{
static ClassB statVar = {0};
if(!statVar.ptrMember)
statVar.ptrMember = new ClassA();
return statVar.ptrMember;
}
theFunction()
に保存されているアドレスへの複数の呼び出し中は&statVar
常に同じままでしたが、その後の呼び出しではアドレス&statVar
が異なり、statVar.ptrMember
空であることがわかりました。
私はこれが可能だとは思わなかった!何か案は?