Domanda

Ci sono alcune buone domande e risposte qui attorno al "Fiasco dell'inizializzazione statica", ma mi sembra di aver colpito l'ennesima espressione di esso, Soprattutto brutto perché non si schianta ma perde e perde i dati.

Ho una libreria C ++ personalizzata e un'applicazione che si collega contro di essa. C'è un contenitore STL statico nella biblioteca che registra tutte le istanze di una classe. Tali istanze sono variabili statiche nell'applicazione.

Come risultato del "fiasco" (credo), facciamo riempire il contenitore con le istanze dell'applicazione durante l'inizializzazione dell'applicazione, la libreria viene inizializza la Biblioteca.

Ecco come l'ho riprodotto con codice semplificato:

mylib.hpp:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class MyLibClass {
    static vector<string> registry;
    string myname;
  public:
    MyLibClass(string name);
};

mylib.cpp:

#include "mylib.hpp"

vector<string> MyLibClass::registry;

MyLibClass::MyLibClass(string name)
: myname(name)
{
    registry.push_back(name);
    for(unsigned i=0; i<registry.size(); i++)
        cout << " ["<< i <<"]=" << registry[i];
    cout << endl;
}

MyLibClass l1("mylib1");
MyLibClass l2("mylib2");
MyLibClass l3("mylib3");

myapp.cpp:

#include "mylib.hpp"

MyLibClass a1("app1");
MyLibClass a2("app2");
MyLibClass a3("app3");

int main() {
    cout << "main():" << endl;
    MyLibClass m("main");
}

Compilare gli oggetti con:

g++ -Wall -c myapp.cpp mylib.cpp
g++ myapp.o mylib.o -o myapp1
g++ mylib.o myapp.o -o myapp2

Esegui myapp1:

$ ./myapp1
 [0]=mylib1
 [0]=mylib1 [1]=mylib2
 [0]=mylib1 [1]=mylib2 [2]=mylib3
 [0]=mylib1 [1]=mylib2 [2]=mylib3 [3]=app1
 [0]=mylib1 [1]=mylib2 [2]=mylib3 [3]=app1 [4]=app2
 [0]=mylib1 [1]=mylib2 [2]=mylib3 [3]=app1 [4]=app2 [5]=app3
main():
 [0]=mylib1 [1]=mylib2 [2]=mylib3 [3]=app1 [4]=app2 [5]=app3 [6]=main

Esegui myapp2:

$ ./myapp2
 [0]=app1
 [0]=app1 [1]=app2
 [0]=app1 [1]=app2 [2]=app3
 [0]=mylib1
 [0]=mylib1 [1]=mylib2
 [0]=mylib1 [1]=mylib2 [2]=mylib3
main():
 [0]=mylib1 [1]=mylib2 [2]=mylib3 [3]=main

Ecco che arriva la domanda, Il vettore statico è stato re-iniziamento o utilizzato prima dell'inizializzazione? È un comportamento previsto?

Se io 'ar' la biblioteca come 'mylib.a' (ar rcs mylib.a mylib.o), il problema non si verifica, ma probabilmente perché c'è solo un ordine valido per collegarsi alla .a ed è avendo la biblioteca nell'ultimo posto, come per myapp1 qui.

Ma nella nostra vera applicazione, uno più complesso con molti file di oggetti e alcune librerie statiche (.a) che condividono alcuni registri statici, il problema sta avvenendo e l'unico modo in cui siamo riusciti a risolverlo finora è applicare [10.15] Come prevenire il" fiasco dell'inizializzazione statica "?".

(Sto ancora cercando nel nostro sistema di costruzione un po 'complesso per vedere se stiamo collegando correttamente).

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top