Visual Studio 2013 баг
От: ZiloT  
Дата: 24.10.13 16:21
Оценка: 124 (11)
Всем привет!
Наткнулся на багу в компиляторе в новой студии


#include <vector>
#include <memory>
#include <iostream>

struct Base
{
    virtual ~Base() {}

    virtual void touch() = 0;
};

struct A : public Base
{
    A()
    {
        std::cout << "A()" << std::endl;
    }

    virtual void touch() override
    {
        std::cout << "A::touch()" << std::endl;
    }

    virtual ~A()
    {
        std::cout << "~A()" << std::endl;
    }
};

struct B : public Base
{
    B()
    {
        std::cout << "B()" << std::endl;
    }

    virtual void touch() override
    {
        std::cout << "B::touch()" << std::endl;
    }

    virtual ~B()
    {
        std::cout << "~B()" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    std::vector<std::shared_ptr<Base>> m = {
        std::make_shared<A>(),
        std::make_shared<B>()
    };

    std::cout << "mmm" << std::endl;

    for (auto i : m)
        i->touch();

    
    return 0;
}


Результат работы:

GCC 4.7.2

A()
B()
mmm
A::touch()
B::touch()
~B()
~A()


Visual Studio 2013 RTM

A()
B()
~A() // ???
mmm
// тут краш при обращении к первому элементу, так как он уже удалился...


В общем, получается с микрософтом как всегда, чтоб нормально пользоваться, надо ждать первого, а то и второго update'а
Re: Visual Studio 2013 баг
От: Abyx Россия  
Дата: 24.10.13 19:35
Оценка: -1
Здравствуйте, ZiloT, Вы писали:

ZT>В общем, получается с микрософтом как всегда, чтоб нормально пользоваться, надо ждать первого, а то и второго update'а


пишите юнит-тесты, не используйте initializer lists если они багнутые.
хз в чем тут проблема %)
In Zen We Trust
Re: Visual Studio 2013 баг
От: MT-Wizard Украина  
Дата: 24.10.13 21:37
Оценка:
Здравствуйте, ZiloT, Вы писали:

ZT>Всем привет!

ZT>Наткнулся на багу в компиляторе в новой студии
ZT>...
ZT>В общем, получается с микрософтом как всегда, чтоб нормально пользоваться, надо ждать первого, а то и второго update'а

Да, бага во фронтенде
Хз как умудрились пропустить
А ти, москалику, вже приїхав (с)
Re: Visual Studio 2013 баг
От: uncommon Ниоткуда  
Дата: 25.10.13 02:33
Оценка: :)
Здравствуйте, ZiloT, Вы писали:

ZT>Всем привет!

ZT>Наткнулся на багу в компиляторе в новой студии

Афигеть какой баг! Получается initializer list вообще в VC++ 2013 использовать нельзя?

ZT>В общем, получается с микрософтом как всегда, чтоб нормально пользоваться, надо ждать первого, а то и второго update'а


А это только в следующем году может быть.
Re: Visual Studio 2013 баг
От: MaxLovic  
Дата: 25.10.13 09:56
Оценка:
Что интересно, удаляется только первый добавляемый элемент.
В данном случае вызовется деструктор B, остальные элементы живы.
std::vector<std::shared_ptr<Base>> m = {
        std::make_shared<B>(),
        std::make_shared<A>(),
        std::make_shared<A>()
    };


И это бага только при преобразовании к базовому классу. Так работает:
std::vector<std::shared_ptr<A>> m = {
        std::make_shared<A>(),
        std::make_shared<A>()
    };
Re[2]: Visual Studio 2013 баг
От: ArtDenis Россия  
Дата: 25.10.13 14:43
Оценка: :)
Здравствуйте, uncommon, Вы писали:

U>Афигеть какой баг! Получается initializer list вообще в VC++ 2013 использовать нельзя?


Можно, но только осторожно, покрывая каждую строку с initializer list десятью строками тестов
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Visual Studio 2013 баг
От: ArtDenis Россия  
Дата: 26.10.13 15:41
Оценка:
Здравствуйте, ZiloT, Вы писали:

ZT>Всем привет!

ZT>Наткнулся на багу в компиляторе в новой студии

А разработчики об этом баге уже в курсе?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Visual Studio 2013 баг
От: ZiloT  
Дата: 27.10.13 10:23
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, ZiloT, Вы писали:


ZT>>Всем привет!

ZT>>Наткнулся на багу в компиляторе в новой студии

AD>А разработчики об этом баге уже в курсе?


Ага. Написал им, ответили, что про этот баг они в курсе. Когда будет фикс ничего не написали
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.