Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

176
Vistas
Variable no configurada dentro de __attribute__((constructor)) o restablecimiento de variable estática global después de invocar __attribute__((constructor))

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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(); }
over 4 years ago · Santiago Trujillo Denunciar

0

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() .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda