2011-09-24 16 views
5

tengo un vector en una cabecera, así:¿Vaciar el vector global entre llamadas?

extern std::vector<Foo> g_vector; 

En el archivo CPP asociado tengo esto:

std::vector<Foo> g_vector; 

también tengo una clase Bar, y en ella del constructor que se sumará algunas cosas para g_vector, así:

Bar::Bar(/* stuff */) 
{ 
    // do things 
    std::cout << g_vector.size() << std::endl; 
    g_vector.push_back(somefoo); 
    std::cout << g_vector.size() << std::endl; 
} 

Si declarar una Bar dentro de una función, como un cuerdo persona, parece funcionar bien. Sin embargo, si quiero declarar Bar fuera de una función, suceden cosas raras. Por ejemplo, tengo un Bar declarada en MyFile1.cpp y en MyFile2.cpp, y debido a mis instrucciones cout en Bar puedo ver la Foo conseguir presionado en el vector, pero cuando se ejecuta la siguiente Bar su constructor tamaño del vector es 0 de nuevo. En otras palabras, mi salida es

0 
1 
0 
1 

¿Qué ofrece? Para estar doblemente seguro, también intenté imprimir &g_vector para asegurarme de que realmente era push_back en el vector correcto, y todas las direcciones coinciden. Por lo que vale, no importa qué orden tengan estas cosas para el vector. No estoy preocupado con la orden de inicialización ni nada.

+1

¿Tiene alguna razón para creer que su 'g_vector' conseguirá construidos antes de la instancia estática' bar' sean? – Gabe

Respuesta

6

No está seguro de lo que realmente es el problema, pero supongo que el siguiente patrón ayudará a resolver es: definir un descriptor de acceso a la variable global y asignarlo como una variable de función estática como se muestra a continuación.

En el archivo de cabecera:

std::vector<Foo> &getGlobalVector(); 

En el archivo CPP:

std::vector<Foo> &getGlobalVector() 
{ 
    static std::vector<Foo> s_vector; 
    return s_vector; 
} 

Este patrón se inspira de aplicación "Singleton genérico" de Andrei Alexandrescu en Modern C++ diseño.

Tengo el hábito de utilizar sistemáticamente este patrón cada vez que me topé con una variable global existente mientras mantengo las aplicaciones existentes (o en las raras ocasiones en que elegí usar una yo mismo), y puede haber ayudado a eliminar una par de errores difíciles de reproducir en dichas aplicaciones.

En cualquier caso, esto debería ayudar realmente a evitar cualquier inicialización múltiple o de orden de inicialización tema relacionado.

6

Orden de inicialización de los valores globales no está definido.

leer aquí acerca de la static initialization fiasco.

Cuando declara Bar en una función - el g_vector se inicializará antes, porque se prometió inicializar antes de que se ejecute el programa. Si Bar es una variable global, entonces usted tiene un problema.

Cuestiones relacionadas