Мне интересно следующий код:
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
}
[...]
}
... в этом случае, если два потока будут вызывать MyFunction () почти одновременно, тогда _myArray может быть выделен дважды, что приведет к утечке памяти?
Или это как-то правильно обрабатывается?