次のコードに興味があります。
class MyClass
{
public:
MyClass() : _myArray(new int[1024]) {}
~MyClass() {delete [] _myArray;}
private:
int * _myArray;
};
// This function may be called by different threads in an unsynchronized manner
void MyFunction()
{
static const MyClass _myClassObject;
[...]
}
上記のコードで競合状態が発生する可能性はありますか? 具体的には、コンパイラは次の「舞台裏」に相当するコードを生成する可能性がありますか?
void MyFunction()
{
static bool _myClassObjectInitialized = false;
if (_myClassObjectInitialized == false)
{
_myClassObjectInitialized = true;
_myClassObject.MyClass(); // call constructor to set up object
}
[...]
}
...この場合、2 つのスレッドがほぼ同時に MyFunction() を呼び出すと、_myArray が 2 回割り当てられ、メモリ リークが発生する可能性があります。
それとも、これはどういうわけか正しく処理されていますか?