class Base
{
int m_count = {}; // если закоментировать инициализацию, то все ок. зачем-то у Derived обнуляется указатель на виртуальную таблицу.
};
struct Derived : public Base
{
virtual ~Derived() {}
void test() { do_test(); }
virtual void do_test() = 0;
};
struct Test : Derived
{
virtual void do_test() {
std::cout << "ok";
}
};
Test d;
int main()
{
d.test();
return 0;
}
Здравствуйте, netch80, Вы писали:
NB>>Пол дня потратил разбираясь
N>5.3 искать сложно, есть доступный 5.4, ничего странного не воспроизводится, аж на двух платформах.
да, на ideone запускал -- нормально.
5.3 по дефаулту в виндовом qtcreator
Здравствуйте, Zhendos, Вы писали:
NB>>Пол дня потратил разбираясь
NB>>Валится:
Z>С gcc 6.3.1 не воспроизводится, а вот на gcc 5.3.0 и у меня падает, Z>забавно, что "Base() {}" исправляет баг, а "Base() = default;" нет.
одна из причин, почему на новый стандарт долго не перебирался.
Здравствуйте, night beast, Вы писали:
NB>Пол дня потратил разбираясь
NB>Валится: NB>
NB>class Base
NB>{
NB> int m_count = {};
NB>};
NB>
А если там инициализировать чем-то иным? Ну, скажем, m_count=12345 или m_count={12345} ?
Я подозреваю, что компилятор криво сгенерировал конструктор Derived из неявно определённого конструктора Base. Забыл сделать смещение базы (поскольку vfptr обычно размещают в самом начале объекта, жертвуя смещением неполиморфной базы), в результате этот самый 0 (или, как я предлагаю попробовать, 12345) попадает не в m_count, а в vfptr.
Здравствуйте, Кодт, Вы писали:
NB>>Пол дня потратил разбираясь
К>А если там инициализировать чем-то иным? Ну, скажем, m_count=12345 или m_count={12345} ?
все равно падает.
не падает если сделать переменную локальной;
или инициализировать Test d = {}.
К>Я подозреваю, что компилятор криво сгенерировал конструктор Derived из неявно определённого конструктора Base. Забыл сделать смещение базы (поскольку vfptr обычно размещают в самом начале объекта, жертвуя смещением неполиморфной базы), в результате этот самый 0 (или, как я предлагаю попробовать, 12345) попадает не в m_count, а в vfptr.
нет. m_count инициализируется как надо. vfptr ноль.
ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом
Здравствуйте, night beast, Вы писали:
NB>нет. m_count инициализируется как надо. vfptr ноль. NB>ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом
Здравствуйте, Кодт, Вы писали:
NB>>нет. m_count инициализируется как надо. vfptr ноль. NB>>ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом
К>Ну и не совсем фиг! К>В багтрекере у гуся такого бага нет. К>искомое слово "virtual" по всем багам для g++5.3.0
как выяснили, уже на 5.4 не воспроизводится.
перешел на 6.1. пока полет нормальный.
К>Возможно, что это какой-то плавающий баг, и ты первый, кто на него налетел. К>Я бы на твоём месте заслал им багрепорт.