5

ja spotkałem, co wydaje mi się być uszkodzony wirtualny stół, który wynika z budowy i funkcjonowania zamieszczonych poniżej przykładowy kod w Visual Studio 2015.uszkodzony wirtualny stół studio visual bug

Kiedy go uruchomić, wyjątek jest generowany, gdy przypisano m_string.

Sprawdziłem, że kod jest budowany i działa zgodnie z zamierzeniami przy użyciu kompilatorów zarówno gcc, jak i Clang.

Próbowałem uczynić przykład tak minimalnym, jak to możliwe, ponieważ został zsyntetyzowany z bardzo dużego projektu.

Ponadto zdaję sobie sprawę, że zwracam wartość null z niektórych funkcji - rzeczywista wartość zwracana nie jest istotna dla problemu, ale może to być typ zwracany. Czy to możliwe błąd Visual Studio?

#include <iostream> 
#include <memory> 
#include <string> 

struct A { virtual ~A(void) { } }; 
struct B { virtual ~B(void) { } }; 
struct C : public A, public B { virtual ~C(void) override { } }; 

struct D 
{ 
    virtual ~D(void) { } 
    virtual B *func(void) = 0; 
}; 

struct E : public D 
{ 
    virtual ~E(void) override { } 
    virtual C *func(void) override { return nullptr; } 
}; 

struct F : public A, public E 
{ 
    virtual ~F(void) override { } 
    C *func(void) override 
    { 
     m_string = "Why does the act of setting this field cause a crash?"; 

     return nullptr; 
    } 

    std::string m_string; 
}; 

int main(int argc, char **argv) 
{ 
    std::unique_ptr<F> pF(new F()); 
    (dynamic_cast<D *>(pF.get()))->func(); 
    pF->func(); 

    return 0; 
} 
+0

czy masz dostęp do poprzedniej wersji MSVC? – Igor

+2

Skorzystaj z witryny connect.microsoft.com, aby zgłosić ten problem lub zadzwoń do pomocy technicznej firmy Microsoft, gdy nie możesz się doczekać. –

+0

Przynajmniej mogę poprawić twoje obserwacje, jak widać [tutaj] (http://coliru.stacked-crooked.com/a/e6b49c3b451dc769) i [tutaj] (http://coliru.stacked-crooked.com/a/0c5d90a1ebbd3a68). –

Odpowiedz

2

Rozwiązaniem jest dziedziczenie z wirtualnej klasy A.

struct C : virtual public A, public B { virtual ~C(void) override { } }; 

lub

struct F : virtual public A, public E { ... } 

Problem jest najprawdopodobniej związany z desctructors wirtualnych klas bazowych. Może inni mogą podać więcej wyjaśnień, dlaczego to działa.

Jak wskazano przez dziedziczenie klas odziedziczonych @JamesAdkison (zmiana struct C : public A, public B {...} na struct C : public B, public A {...}) również rozwiązuje problem; zmienia się więc struct F : public A, public E { ... } do struct F : public E, public A { ... }. Wygląda to jak błąd w MSVC, jak wspomniał @Josh P.

+0

Wierzę, że wszystkie opinie (szczególnie dotyczące zamiany kolejności, w której klasy są dziedziczone) potwierdzają to jako błąd w kompilatorze MSVC; W takim przypadku skontaktuję się z firmą Microsoft. Dzięki! –

+1

Josh, czy skontaktowałeś się z MS? Czy istnieje problem związany z Connectem? –

+0

Tak, skontaktowałem się z firmą Microsoft i mogę potwierdzić, że ich najnowsza aktualizacja (aktualizacja 3) do programu Visual Studio 2015 rozwiązuje problem. –