gpt4 book ai didi

c++ - 损坏的虚拟表 visual studio 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:13 25 4
gpt4 key购买 nike

我遇到了一个在我看来是损坏的虚拟表,它是在 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;
}

最佳答案

一种解决方案是使类 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 中的一个错误。

关于c++ - 损坏的虚拟表 visual studio 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com