我是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芯片编写此代码。
谢谢
最佳答案
如果由于某种原因(例如在嵌入式场景中)可能未链接到标准库,则必须提供自己的运算符new
和delete
。在最简单的情况下,您可以只包装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);
}
如果要针对普通的托管平台进行编译,则永远不必这样做,因此,如果确实需要这样做,则最好熟悉平台上内存管理的复杂性。