为什么C ++'new'运算符的实现有效?

时间:2013-01-09 12:26:08

标签: c++ memory malloc avr libc

我发现AVR uCs的C ++编译器不支持newdelete运算符,但也有快速解决方法:

void * operator new(size_t size) 
{ 
  return malloc(size); 
} 

void operator delete(void * ptr) 
{ 
  free(ptr); 
}

我假设现在可以拨打new ClassName(args);

但是,我不确定这是如何工作的。例如,这里实际返回size_t的是什么?我认为构造函数不会返回任何内容......

是不是new现在应该以不同的方式使用(与sizeof()一起使用)?

2 个答案:

答案 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);