【发布时间】: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 支持。
-
只是观察。我能够在 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