В моей общей библиотеке мне нужно загрузить некоторые данные в unordered_map, и я пытаюсь сделать это с помощью функции, отмеченной __ attribute __ ((constructor)).Однако я получил SIGFPE на каждой операции с картой.После некоторого изучения стека overoverflow я обнаружил, что это означает, что unordered_map неинициализирован.Это довольно неожиданно и непонятно для меня, потому что, на первый взгляд, это нарушает контракты C ++.Кто-нибудь может помочь с тем, как я могу запустить этот метод после запуска конструкторов?Вот рабочий пример с моим собственным конструктором, который показывает, что он не называется:
#include <stdio.h>
class Ala {
int i;
public:
Ala() {
printf("constructor called\n");
i = 3;
}
int getI() {
return i;
}
};
Ala a;
__attribute__((constructor))
static void initialize_shared_library() {
printf("initializing shared library\n");
printf("a.i=%d\n", a.getI());
printf("end of initialization of the shared library\n");
}
В результате получается
initializing shared library
a.i=0
end of initialization of the shared library
constructor called
, однако, если вы попытаетесь использовать std :: cout вместоprintfs затем сразу переходит в SEGFAULT (потому что конструктор потоков не запускался)