由代码错误引起的 MSB6006 错误“CL.exe 退出,代码 -1073741819”

时间:2021-02-13 19:02:01

标签: c++ visual-studio compiler-errors cl

TLDR:IDE 和编译器都错过了代码中的错误,只有这个退出代码才会报告。

在对我的关于虚拟方法的代码进行小幅编辑后,我似乎突然收到了上述错误。将退出代码转换为十六进制会给出 0xc0000005,这是一个访问冲突。同样的问题正在解决 herehere。根据这些讨论,这可能是由于 cl.exe 因任何原因无法访问造成的,但这些原因不适用于我的情况(我检查过)。

某处提到的另一个原因(我丢失了链接)是项目特定设置中的错误。我的其他项目编译没有问题,所以我试图解决这个问题。即使我创建了一个新的(此副本)项目,它也能正常工作。然而,当我将所有标题和源代码移动到这个新项目时,它又开始做这件事了。

1 个答案:

答案 0 :(得分:0)

我试着回到突然开始出现错误的地方,我找到了。我不知道是怎么回事,但这个错误是由我写的一段不正确的代码引起的。

我的一个头文件包含两个类,其中一个(基础)是独立的,但另一个(派生)也为它提供了一个特定的包装器。两者都有相同的方法(相同的名称和参数列表),这可能不是最好的方法,但似乎编译没有问题。

class Base {
    void DoStuff(void*);
    void SetValue(bool);
}

class Derived : private Base {
    void* m_ptr;
    void DoStuff() { Base::DoStuff(m_ptr); }
    void SetValue(bool b) { Base::SetValue(b); }
}

注意我这样做是因为DoStuff的参数不同,否则我只会公开继承。

为了方便起见,我决定添加一个类似接口的(抽象)类,错误开始出现。

struct Iface {
    virtual void SetValue(bool) = 0;
}

class Base : public Iface {
    void DoStuff(void*);
    void SetValue(bool) final;
}

class Derived : private Base {
    void* m_ptr;
    void DoStuff() { Base::DoStuff(m_ptr); }
    void SetValue(bool b) { Base::SetValue(b); }
}

你看到我在这里犯的明显错误了吗?

去掉final后,再次编译代码。 IDE 没有发现我的错误,可能是因为 BaseDerived 实际上都是模板,编译器也没有,首先要抱怨的显然是 CL,这给了这个不完全清楚的退出代码。