我是C++编程的新手,但是从事C和Java已有很长时间了。我正在尝试使用一些正在研究的串行协议(protocol)进行类似接口(interface)的层次结构,并不断收到错误消息:

Undefined reference to 'operator delete(void*)'

(简化的)代码如下:

PacketWriter.h:
class PacketWriter {
public:
    virtual ~PacketWriter() {}
    virtual uint8_t nextByte() = 0;
}

StringWriter.h:
class StringWriter : public PacketWriter {
public:
    StringWriter(const char* message);
    virtual uint8_t nextByte();
}

构造函数和nextByte函数在StringWriter.cpp中实现,但仅此而已。我需要能够从指向PacketWriter的指针中删除StringWriter,并且如果我为StringWriter定义了析构函数,无论是否为虚拟,我都会遇到各种其他类似的错误。我敢肯定,作为一个新手,这是一个简单的问题。

另外,我正在Windows上使用avr-g++为AVR芯片编写此代码。

谢谢

最佳答案

如果由于某种原因(例如在嵌入式场景中)可能未链接到标准库,则必须提供自己的运算符newdelete。在最简单的情况下,您可以只包装malloc,或从自己喜欢的来源分配内存:

void * operator new(std::size_t n)
{
  void * const p = std::malloc(n);
  // handle p == 0
  return p;
}

void operator delete(void * p) // or delete(void *, std::size_t)
{
  std::free(p);
}

如果要针对普通的托管平台进行编译,则永远不必这样做,因此,如果确实需要这样做,则最好熟悉平台上内存管理的复杂性。

10-08 11:24