Здравствуйте.
Имеется обычный класс classA, в котором есть статический объект другого класса classB. Проблема в том, что не вызывается конструктор класса classB.
Код примерно следующий:
template<typename T>
classB
{
public:
classB()
{
//вот сюда не заходит
}
void func()
{
//ошибка, т.к. в конструкторе не были проинициализированы данные
}
};
и main.cpp
int main()
{
classA::fo();
while(1)
{}
}
если же сделать так, то все работает
int main()
{
classA a = new classA();
classA::fo();
while(1)
{}
}
Компилятор GCC под ARM.
В обычном GCC все работает.
Конструктор должен вызваться до функции main, где-то в дебрях сгенерированного компилером кода.
То есть раз ембедед, то может тест сдрам невовремя запускается (например, в конструкторе другого класса ) или инитится она поздно, или просто портится память. То есть вариант тот что конструкор вызвался, данные проиничены, но кто-то их попортил, или таки брекпоинтом проверили что в конструктор не заходит?
Re: не вызывается конструктор для статического объекта
Здравствуйте, levsh, Вы писали:
l> Компилятор GCC под ARM. l> В обычном GCC все работает.
Было у нас такое, и тоже embeded. Поставщик системы неправильно собрал поддержку для C++.
Для инициализации статических объектов надо вызвать сгенерированные функции, который были сложены в отдельный сегмент — тут вам надо посмотреть файлик, с описанием сегментов приложения (что-то типа mapping.def).
У нас получилась вот такая функция, которая вызывала функции инициализации статических объектов.
/**
* \brief Fix for C++ constructors calls
*
* \warning This fix is required ONLY for XXX platform.
*/void do_ctor_calls()
{
static bool ctor_call_once = false;
if(ctor_call_once == true) return;
typedef void (*call_ctor_t)(void);
extern call_ctor_t __ctors_start__[];
extern call_ctor_t __ctors_end__[];
call_ctor_t * ctor_call = __ctors_start__;
while(ctor_call < __ctors_end__)
{
(*ctor_call)();
ctor_call++;
}
ctor_call_once = true;
}
PS Нам повезло, так сами функции инициализаторы были сделаны, забыли только их вызвать.
Здравствуйте, avbochagov, Вы писали:
A>Для инициализации статических объектов надо вызвать сгенерированные функции, который были сложены в отдельный сегмент — тут вам надо посмотреть файлик, с описанием сегментов приложения (что-то типа mapping.def).
Спасибо. Да, нужно вручную вызывать конструкторы для статических объектов до входа в main(), сам комипилятор только помещает указатели на них в секцию .init_array.
Re[3]: не вызывается конструктор для статического объекта
Здравствуйте, levsh, Вы писали:
l> A>Для инициализации статических объектов надо вызвать сгенерированные функции, который были сложены в отдельный сегмент — тут вам надо посмотреть файлик, с описанием сегментов приложения (что-то типа mapping.def).
l> Спасибо. Да, нужно вручную вызывать конструкторы для статических объектов до входа в main(), сам комипилятор только помещает указатели на них в секцию .init_array.