3

我发现 AVR uCs 的 C++ 编译器不支持newanddelete运算符,但也有一个快速修复:

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

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

我假设现在可以调用new ClassName(args);.

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

难道new现在应该以不同的方式使用(与 结合sizeof())?

4

2 回答 2

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应该调用构造函数 of Tmakingstorage是该this构造函数中的指针。)

operator new部分获得请求的原始存储量,而构造函数调用是通过调用构造函数实际生成对象的部分。

问题中的代码只替换了operator new部分,即存储的检索。当sizeof您使用new T(args).


† 该语言有一种方法可以表达这种直接的构造函数调用,称为“放置new”,但为了清楚起见,我省略了它。

于 2013-01-09T12:34:27.757 回答
0

从编译器名称(uC)来看,我认为它是用于嵌入式控制器的。这是有道理的,因为您很少需要使用嵌入式设备进行动态内存管理,但可能会从“C with classes”中受益。希望它支持'placement new',这样你就可以实际使用 C++。

如果您的编译器不支持 new 和 delete,那么它就不是 C++ 编译器了!

我认为关键字“新”有效地转换为:

Object* pointer = (Object *)new(sizeof Object);
pointer->Object_Constructor(args);
于 2013-01-09T12:37:25.350 回答