не вызывается конструктор для статического объекта
От: levsh  
Дата: 21.01.12 21:10
Оценка:
Здравствуйте.
Имеется обычный класс classA, в котором есть статический объект другого класса classB. Проблема в том, что не вызывается конструктор класса classB.
Код примерно следующий:

file classA.h
classA
{
static classB<int> b;
public:
static void fo ()
{
    b.func();
}
};


file classA.cpp
classB<int> classA::b;



file classB.h
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 все работает.
c++ конструктор gcc arm статический
Re: не вызывается конструктор для статического объекта
От: pepelac Россия  
Дата: 21.01.12 22:11
Оценка:
Здравствуйте, levsh, Вы писали:

L>
classB<int> classA::b;
L>


Конструктор должен вызваться до функции main, где-то в дебрях сгенерированного компилером кода.
То есть раз ембедед, то может тест сдрам невовремя запускается (например, в конструкторе другого класса ) или инитится она поздно, или просто портится память. То есть вариант тот что конструкор вызвался, данные проиничены, но кто-то их попортил, или таки брекпоинтом проверили что в конструктор не заходит?
Re: не вызывается конструктор для статического объекта
От: avbochagov Россия  
Дата: 23.01.12 06:47
Оценка:
Здравствуйте, 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 Нам повезло, так сами функции инициализаторы были сделаны, забыли только их вызвать.
avalon 1.0rc3 rev 416, zlib 1.2.3
Re[2]: не вызывается конструктор для статического объекта
От: levsh  
Дата: 23.01.12 07:54
Оценка:
Здравствуйте, avbochagov, Вы писали:

A>Для инициализации статических объектов надо вызвать сгенерированные функции, который были сложены в отдельный сегмент — тут вам надо посмотреть файлик, с описанием сегментов приложения (что-то типа mapping.def).


Спасибо. Да, нужно вручную вызывать конструкторы для статических объектов до входа в main(), сам комипилятор только помещает указатели на них в секцию .init_array.
Re[3]: не вызывается конструктор для статического объекта
От: avbochagov Россия  
Дата: 25.01.12 12:03
Оценка:
Здравствуйте, levsh, Вы писали:

l> A>Для инициализации статических объектов надо вызвать сгенерированные функции, который были сложены в отдельный сегмент — тут вам надо посмотреть файлик, с описанием сегментов приложения (что-то типа mapping.def).


l> Спасибо. Да, нужно вручную вызывать конструкторы для статических объектов до входа в main(), сам комипилятор только помещает указатели на них в секцию .init_array.


А платформа у вас, случаем, не французская?
avalon 1.0rc3 rev 416, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.