当前位置: 首页 > 知识库问答 >
问题:

虚拟析构函数Arduino由于对运算符删除的未定义引用

暴英达
2023-03-14

当接口包含纯虚方法时,建议使用虚拟析构函数。例如,我有这样的代码:


    template
    class A {
    protected:
        char buffer[Size];
    public:
        virtual void method() = 0;
        A() = default;
        virtual ~A() = default;
    };

    template
    class B : public A {
    public:
        void method() override;
        B() = default
        ~B() = default;
    };

    int main() {
        B b;
        b.method();
    }

但是,当我试图用g为Arduino Due编译时,我得到了以下错误:


    main.cpp:(.text._ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED0Ev[_ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED5Ev]+0x6): undefined reference to `operator delete(void*, unsigned int)'

然而,当我将析构函数从一个整体中删除时,它会删除错误,但这不会导致未反馈的行为吗?此外,当我刚刚从的析构函数中删除virtual关键字时,它会给我相同的错误消息。

共有1个答案

柳德义
2023-03-14

非常奇怪的是,只有析构函数的存在才会引入对全局删除算子的引用。然而,您似乎不是第一个遇到这个问题的人:对“operator delete(void*)”的未定义引用。正如在那里的评论中指出的那样,C标准库在avr-g上实际上并不可用,而avr-g很可能也是您正在使用的。

尽管如此,我相信我可以提供一些救济。

当接口包含纯虚方法时,建议使用虚析构函数。

虚拟析构函数仅在您需要通过基指针[expr.delete]/3删除对象时才是必需的。将虚拟析构函数视为接口本身的一部分。如果接口声明了虚拟析构函数,则意味着“可以删除实现该接口的对象”。操作删除成为接口的一部分。

如果您不需要将删除功能作为界面的一部分(我认为这实际上应该是默认功能),那么您就不需要虚拟析构函数。只需声明析构函数为非虚拟并对其进行保护。因此,您可以从接口中删除操作delete,并将是否可以进一步删除类型的决定传递给接口的更具体实现…

 类似资料:
  • 我读过一些文章,正如他们所说,主要的虚拟析构函数用例是: > 派生类可能具有来自堆的动态数据分配,即“拥有”该数据对象。所以,他们需要在析构函数中使用一些删除例程。通过基类指针删除需要在所有派生类中声明析构函数,直到那些具有动态数据分配的析构函数(基类也需要它) 此类具有< code >虚拟方法。但这对我来说不清楚。仅仅通过基类指针调用< code >虚拟方法总是会导致派生实现最多的调用。他们唯一

  • 我得到一个 据我所知,构造函数是被定义的,但是编译器显然看不到它。我唯一的结论是存在某种包含问题(例如,循环包含)。 我已经为下面的每个翻译单元制作了一个包含图,但是我看不出有任何问题。任何指导都将不胜感激。 包括:

  • 问题内容: 我正在使用Linux,并且具有以下文件: 该函数在中声明和定义。我需要在中使用该函数,因此我将该函数声明为 在。 但是,在编译过程中,我得到了错误 怎么了? 谢谢。 预计到达时间:多亏了我收到的答案,我现在有了以下内容: 在fileA.h中,我有 在fileA.c中,我有 在fileB.h中,我有 在fileB.cpp中,我有 但是,我现在有错误 问题答案: 如果您确实是使用C而不是C

  • 在C 11中,我们能够声明一个析构函数是自动生成的: 此外,我们可以将析构函数声明为纯虚: 我的问题是:如何将析构函数声明为自动生成和纯虚拟?看起来以下语法不正确: 这一个也不是: 也不是这个: 编辑:关于问题目的的一些澄清。基本上,我希望一个空类是不可实例化的基类,但派生类是可实例化的,那么该类必须有一个纯虚拟析构函数。但另一方面,我不想在.cpp文件中提供定义。因此,我需要某种与等效的机制。我

  • 问题内容: 我只是试图制作一个简单的类,让我弄清楚文件的长度: 我遇到了一个问题 我得到错误: 未为参数类型定义运算符!= int,null 有什么想法为什么会阻止这种情况吗? 问题答案: Java中的原始类型不能为。如果要检查0,请执行。