Jos*_*h P 6 c++ visual-studio-2010 visual-studio visual-studio-2012 visual-studio-2015
我遇到了一个由于构建和运行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;
}
Run Code Online (Sandbox Code Playgroud)
一个解决方案是使 A 类的继承成为虚拟的。
struct C : virtual public A, public B { virtual ~C(void) override { } };
Run Code Online (Sandbox Code Playgroud)
或者
struct F : virtual public A, public E { ... }
Run Code Online (Sandbox Code Playgroud)
该问题很可能与基类中的虚拟析构函数有关。也许其他人可以提供更多解释为什么它有效。
正如 @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 中的一个错误。
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |