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

我发现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”,但为了清楚起见,我省略了它.

上一篇:AVR_Interrupt


下一篇:在C函数中传递原始数据类型的最佳实践