[megoldva] statikus változók inicializálása

Fórumok

Adott egy alma osztály:


class alma
{
public:
alma();
private:
static std::string str;
};

alma::alma()
{
if (str != "") {
printf("nem ures\n");
}
printf("alma::alma()\n");
}

alma theApp;
std::string alma::str;

g++ 4.7.2: crash
clang 3.2: crash
g++ 3.3: ok
visual studio 2005: ok

Szóval: a probléma az, hogy az alma konstruktorában a str még nincs létrehozva, ezért van a crash.
És hogy a statikus változók amúgy egyenértékűek a normális globális változókkal.
Persze, ha felcserélem a theApp-t és az alma::str-t sorrendjét, minden ok.

A kérdés: ti mit tudtok, hogy a standard előírja-e ebben az esetben, hogy a statikus változók inicializálásának sorrendjében figyelembe kellene venni ezek dependenciáját is? Vagy nem :)

u.i.: google már volt, de túl sok szerencsém és időm sem volt.

Hozzászólások

Esetleg probald meg megcserelni a sorrendet kodban.

Az biztos, hogy a kulonbozo modulok statikus valtozoinak inicializalasi sorrendje nem meghatarozott, de abban nem vagyok biztos, hogy modulon belul sem.

C++03

[class.static.data]

p7: Static data members are initialized and destroyed exactly like non-local objects (3.6.2, 3.6.3).

Ha egy file-ba rakod a definíciókat, akkor a standard szerint független vagy a fordítótól, és neked kell függőségi sorrendbe tenni a definíciókat, különben zérus-inicializált objektumokat fogsz használni:

[basic.start.init]

p1: Objects with static storage duration [...] shall be zero-initialized [...] before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization. [...] Objects with static storage duration defined in namespace scope in the same translation unit and dynamically initialized shall be initialized in the order in which their definition appears in the translation unit. [...]

Ha külön file-ba rakod a definíciókat, akkor a sorrend specifikálatlannak tűnik. A

[basic.start.init]

p3 tesz néhány implementációfüggő kikötést a main()-nel való relatív sorrendről, de hosszú és bonyolult, és neked nem is ez kell, úgyhogy nem idézem.