【问题标题】:corrupted virtual table visual studio bug损坏的虚拟表视觉工作室错误
【发布时间】:2016-08-30 04:25:06
【问题描述】:

我遇到了在我看来是损坏的虚拟表,这是由于在 Visual Studio 2015 中构建和运行下面发布的示例代码而导致的。

当我运行它时,分配了 m_string 时会引发异常。

我已经验证了代码可以使用 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;
}

【问题讨论】:

  • 您可以访问以前版本的 MSVC 吗?
  • 使用 connect.microsoft.com 报告此问题或在迫不及待时致电 Microsoft 支持。
  • 至少我可以改善您的观察结果,如 herehere 所见。
  • 只是观察。我能够在 VS2013 中重现此问题,并更改继承类的顺序解决了该问题。换句话说,将struct F : public A, public E 更改为struct F : public E, public A
  • @JamesAdkison 如果您将struct C : public A, public B {...} 更改为struct C : public B, public A {...},也是如此。

标签: c++ visual-studio visual-studio-2010 visual-studio-2012 visual-studio-2015


【解决方案1】:

一种解决方案是从类 A 虚拟继承。

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

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

问题很可能与基类中的虚拟析构函数有关。也许其他人可以提供更多解释为什么这样做。

正如@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 中的一个错误。

【讨论】:

  • 我相信所有的反馈(尤其是关于交换继承类的顺序)都证实这是 MSVC 编译器中的一个错误;我会相应地联系微软。谢谢!
  • 乔希,你联系 MS 了吗?是否存在连接问题?
  • 是的,我联系了 Microsoft,我可以确认他们对 Visual Studio 2015 的最新更新(更新 3)解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多