5

Ich habe festgestellt, was mir scheint, eine beschädigte virtuelle Tabelle zu sein, die vom Aufbau führt und den Betrieb der Beispielcode unten in Visual Studio geschrieben 2015beschädigt virtuellen Tisch Visual Studio Bug

Wenn ich es laufen, ist eine Ausnahme geworfen, wenn m_string zugewiesen wurde.

Ich habe überprüft, dass der Code erstellt und wie vorgesehen ausgeführt wird, mit beiden GCC und Clang Compiler.

Ich habe versucht, das Beispiel so minimal wie möglich zu machen, da es aus einem sehr großen Projekt synthetisiert wurde.

Auch ich merke, dass ich null von einigen der Funktionen zurückgeben - der tatsächliche Rückgabewert ist nicht relevant für das Problem, aber der Rückgabetyp möglicherweise. Ist das ein möglicher Visual Studio Bug?

#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

erwähnt haben Sie Zugriff auf eine frühere Version von MSVC? – Igor

+2

Verwenden Sie connect.microsoft.com, um dieses Problem zu melden, oder rufen Sie Microsoft Support an, wenn Sie nicht warten können. –

+0

Zumindest kann ich Ihre Beobachtungen verbessern, wie Sie [hier] (http://coliru.stacked-crooked.com/a/e6b49c3b451dc769) und [hier] (http://coliru.stacked-crooked.com/a/0c5d90a1ebbd3a68) sehen können). –

Antwort

2

Eine Lösung besteht darin, Vererbung von Klasse A virtuell zu machen.

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

oder

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

Das Problem der meisten ist wahrscheinlich auf den virtuellen desctructors in den Basisklassen zusammen. Vielleicht können andere mehr erklären, warum das funktioniert.

Wie von @ JamesAdkison aufgezeigt, das Vertauschen geerbter Klassen (struct C : public A, public B {...} zu struct C : public B, public A {...} zu ändern) behebt das Problem auch; dies ändert sich auch struct F : public A, public E { ... } zu struct F : public E, public A { ... }. Also, es scheint wie ein Fehler in MSVC, wie von @Josh P.

+0

Ich glaube, dass alle Rückmeldungen (insbesondere über das Vertauschen der Reihenfolge, in der die Klassen vererbt werden) dies als einen Fehler im MSVC-Compiler bestätigt; Ich werde Microsoft entsprechend kontaktieren. Vielen Dank! –

+1

Josh, hast du MS kontaktiert? Gibt es ein Connect-Problem dafür? –

+0

Ja, ich habe Microsoft kontaktiert und kann bestätigen, dass das neueste Update (Update 3) für Visual Studio 2015 das Problem behebt. –

Verwandte Themen