Tengo un std::vector que debe llenarse con algunos valores aleatorios cuando se carga la biblioteca. pero veo que se ha reiniciado después de cargar la biblioteca. ¿Es debido a global y static
código de la biblioteca:
static std::vector<uint8_t> g_randomNr{}; __attribute__((constructor)) void generateRandomNrAtStart(void) { static bool firstLoad = false; g_randomNr.clear(); if (!firstLoad) { firstLoad = true; std::cout << "Library is loaded and generating first random number ...\n"; } std::cout << "Generating random number ...\n"; for (int i = 0; i < 20; i++) { g_randomNr.push_back(i); } std::cout << "Random number generated with length of " << g_randomNr.size() << "\n"; } void getRandomNr(std::vector<uint8_t>& randomNr) { randomNr = g_randomNr; }Código principal:
int main() { std::vector<uint8_t> randomNr{}; getRandomNr(randomNr); std::cout << randomNr.size() << "\n"; return 0; }Producción:
Library is loaded and generating first random number ... Generating random number ... Random number generated with length of 20 0 En el resultado anterior, espero 20 en la función main de cout, pero recibo un vector vacío
Lo más probable es que sufra un fiasco de orden de inicialización estática .
Sugiero la inicialización perezosa del vector :
auto& instance() { static std::vector<uint8_t> g_randomNr; return g_randomNr; }Luego, en su constructor de biblioteca compartida:
__attribute__((constructor)) void generateRandomNrAtStart(void) { auto& g_randomNr = instance(); // ...Y también en la función de hacer una copia:
void getRandomNr(std::vector<uint8_t>& randomNr) { randomNr = instance(); }Otra opción es controlar el orden de la inicialización del vector y la llamada al constructor con prioridades :
__attribute__((init_priority(101))) static std::vector<uint8_t> g_randomNr{}; __attribute__((constructor(102))) void generateRandomNrAtStart() { ... }Demostración en vivo: https://godbolt.org/z/bh9zj9cE3
Posiblemente OT al problema: Tenga en cuenta que el uso de E/S (como std::cout en su caso) en un constructor puede sufrir el mismo problema. Ver, por ejemplo, la extensión del enlazador gcc __attribute__((constructor)) provoca un bloqueo en main() .