损坏的虚拟 table visual studio 错误
corrupted virtual table visual studio bug
我遇到了在我看来是损坏的虚拟 table 的结果,该虚拟 table 是在 Visual Studio 2015 年构建和 运行ning 下面发布的示例代码的结果。
当我运行它时,当m_string被分配时抛出异常。
我已经使用 gcc 和 Clang 编译器验证代码构建和 运行s 符合预期。
我尽量使示例尽可能精简,因为它是从一个非常大的项目中综合而来的。
此外,我意识到我从某些函数中 returning null - 实际的 return 值与问题无关,但 return 类型可能是。这可能是 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;
}
一个解决方案是从 class 继承一个虚拟的。
struct C : virtual public A, public B { virtual ~C(void) override { } };
或
struct F : virtual public A, public E { ... }
问题很可能与基础 classes 中的虚拟析构函数有关。也许其他人可以提供更多解释为什么会这样。
正如@JamesAdkison 所指出的,交换继承的 classes(将 struct C : public A, public B {...}
更改为 struct C : public B, public A {...}
)也解决了这个问题;将 struct F : public A, public E { ... }
更改为 struct F : public E, public A { ... }
也是如此。所以,这似乎是 MSVC 中的一个错误,正如@Josh P.
所提到的
我遇到了在我看来是损坏的虚拟 table 的结果,该虚拟 table 是在 Visual Studio 2015 年构建和 运行ning 下面发布的示例代码的结果。
当我运行它时,当m_string被分配时抛出异常。
我已经使用 gcc 和 Clang 编译器验证代码构建和 运行s 符合预期。
我尽量使示例尽可能精简,因为它是从一个非常大的项目中综合而来的。
此外,我意识到我从某些函数中 returning null - 实际的 return 值与问题无关,但 return 类型可能是。这可能是 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;
}
一个解决方案是从 class 继承一个虚拟的。
struct C : virtual public A, public B { virtual ~C(void) override { } };
或
struct F : virtual public A, public E { ... }
问题很可能与基础 classes 中的虚拟析构函数有关。也许其他人可以提供更多解释为什么会这样。
正如@JamesAdkison 所指出的,交换继承的 classes(将 struct C : public A, public B {...}
更改为 struct C : public B, public A {...}
)也解决了这个问题;将 struct F : public A, public E { ... }
更改为 struct F : public E, public A { ... }
也是如此。所以,这似乎是 MSVC 中的一个错误,正如@Josh P.