Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

182
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda