我发现AVR UC的C编译器不支持new和delete运算符,但还有一个快速修复:
void * operator new(size_t size)
{
return malloc(size);
}
void operator delete(void * ptr)
{
free(ptr);
}
我假设现在可以调用新的ClassName(args);.
但是,我不确定这是如何工作的.例如,这里实际返回size_t的是什么?我认为构造函数不返回任何东西……
难道现在应该以不同的方式使用new(与sizeof()一起使用)?
解决方法:
新T(args);大致相当于以下内容.
void* storage = operator new(sizeof(T)); // obtain raw storage
call_constructor<T>(storage, args); // make an object in it
(这里call_constructor应该调用T的构造函数†使存储成为该构造函数中的this指针.)
运算符new部分通过调用构造函数获取所请求的原始存储量,构造函数调用是实际创建对象的调用.
问题中的代码仅替换运算符新部分,即存储的检索.当您使用新的T(args)时,sizeof part和构造函数调用都由编译器自动完成.
†语言有一种表达这种直接构造函数调用的方法,称为“placement new”,但为了清楚起见,我省略了它.