其他分享
首页 > 其他分享> > 为什么C’new’运算符的实现有效?

为什么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,libc,c,malloc,memory
来源: https://codeday.me/bug/20190723/1510816.html