5

が破損しましたm_stringが割り当てられたときにスローされます。は、私はそれを実行すると、例外はある例のコードは、Visual Studioでの下に2015年</p> <p>投稿を構築し、実行した結果、破損した仮想テーブルであることを私には思われるものが発生している仮想テーブルのVisual Studioのバグ

私は、gccとClangの両方のコンパイラを使用してコードが意図したとおりにビルドされて動作することを確認しました。

非常に大きなプロジェクトから合成されたので、私はこの例を可能な限り小さくしようとしました。

また、私はいくつかの関数からnullを返すことを認識しています。実際の戻り値は問題とは関係ありませんが、戻り値の型がある可能性があります。これは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

MSVCの以前のバージョンにアクセスできますか? – Igor

+2

connect.microsoft.comを使用してこの問題を報告するか、待機できないときにMicrosoftサポートに電話してください。 –

+0

少なくとも私は[ここ](http://coliru.stacked-crooked.com/a/e6b49c3b451dc769)と[ここ](http://coliru.stacked-crooked.com/a/0c5d90a1ebbd3a68)のようにあなたの観察を改善することができます)。 –

答えて

2

解決策は、クラスA仮想からの継承を作成することです。

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

または

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

問題はおそらく基底クラス内の仮想desctructorsに関連しています。たぶん、他の人がこれがなぜ機能するのか、もっと説明してくれます。

@JamesAdkisonが継承したクラスを交換することによって指摘されたように(struct C : public A, public B {...}からstruct C : public B, public A {...}に変更)、この問題も解決されます。 struct F : public A, public E { ... }からstruct F : public E, public A { ... }に変更されます。だから、@ Josh P.のように、MSVCのバグのようです。

+0

私はすべてのフィードバック(特にクラスが継承される順序を入れ替えることについて)は、これがMSVCコンパイラのバグであると確信しています。私はそれに従ってMicrosoftに連絡します。ありがとう! –

+1

Josh、MSに連絡しましたか?そこに接続の問題はありますか? –

+0

はい、マイクロソフトに連絡しましたが、Visual Studio 2015の最新のアップデート(Update 3)が問題を修正していることを確認できます。 –

関連する問題

 関連する問題