【问题标题】:Virtual destructor Arduino Due undefined reference to operator delete虚拟析构函数 Arduino 由于未定义对运算符删除的引用
【发布时间】:2019-09-08 05:46:08
【问题描述】:

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

模板 A类{ 受保护: 字符缓冲区[大小]; 民众: 虚拟无效方法()= 0; A() = 默认值; 虚拟〜A()=默认值; }; 模板 B类:公共A { 民众: 无效方法()覆盖; B() = 默认 ~B() = 默认值; }; int main() { 乙乙; b.方法(); }

但是当我尝试使用 g++ 为 Arduino Due 编译时,我收到以下错误:

main.cpp:(.text._ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED0Ev[_ZN4r2d29robot_arm22uarm_gcode_generator_cILj100EED5Ev]+0x6):未定义对“操作符删除(void*, unsigned int)”的引用

但是,当我从 A 中完全删除析构函数时,它会删除错误,但这不会导致 Undifed Behaviour 吗?另外,当我从 A 的析构函数中删除 virtual 关键字时,它会给我同样的错误消息。

【问题讨论】:

  • 您是否链接到 C++ 标准库的实现? stackoverflow.com/q/7015285/1116364
  • 请注意,如果我只是将您的代码复制并粘贴到 Arduino Web 编辑器中(修正错别字后),它在那里编译得很好……

标签: c++


【解决方案1】:

很奇怪,析构函数的唯一存在会引入对全局operator delete 的引用。但是,您似乎不是第一个遇到此问题的人:Undefined reference to 'operator delete(void*)'。正如那里的 cmets 所指出的,C++ 标准库是 not really available on avr-g++,这很可能也是您正在使用的。

尽管如此,我相信我可以提供一些缓解。

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

只有当您需要通过基指针[expr.delete]/3 来delete 对象时,才需要使用虚拟析构函数。将虚拟析构函数视为接口本身的一部分。如果一个接口声明了一个虚拟析构函数,那意味着“实现这个接口的对象可以被删除”。操作delete 成为界面的一部分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2012-11-06
    • 2014-03-13
    • 2014-03-02
    • 2015-08-22
    • 2012-12-03
    相关资源
    最近更新 更多