我发现AVR uCs的C ++编译器不支持new
和delete
运算符,但也有快速解决方法:
void * operator new(size_t size)
{
return malloc(size);
}
void operator delete(void * ptr)
{
free(ptr);
}
我假设现在可以拨打new ClassName(args);
。
但是,我不确定这是如何工作的。例如,这里实际返回size_t
的是什么?我认为构造函数不会返回任何内容......
是不是new
现在应该以不同的方式使用(与sizeof()
一起使用)?
答案 0 :(得分:9)
new T(args);
大致相当于以下内容。
void* storage = operator new(sizeof(T)); // obtain raw storage
call_constructor<T>(storage, args); // make an object in it
(这里call_constructor
应该调用T
的构造函数†,使storage
成为该构造函数中的this
指针。)< / p>
operator new
部分获取所请求的原始存储量,构造函数调用是通过调用构造函数实际创建对象的那个。
问题中的代码仅替换operator new
部分,即存储的检索。 sizeof
部分和构造函数调用都是在您使用new T(args)
时由编译器自动完成的。
†语言有一种表达这种名为“placement new
”的直接构造函数调用的方法,但为了清楚起见,我省略了它。
答案 1 :(得分:0)
从编译器名称(uC),我认为它是嵌入式控制器。这很有意义,因为您很少需要使用嵌入式设备进行动态内存管理,但可能会受益于“C with classes”。希望它支持'placement new',这样你就可以实际使用C ++。
如果您的编译器不支持new&amp;删除,它真的不是一个C ++编译器!
我认为关键字'new'实际上会转换为:
Object* pointer = (Object *)new(sizeof Object);
pointer->Object_Constructor(args);