[英]new operator for memory allocation on heap
我正在看新操作员的签名。 这是:
void* operator new (std::size_t size) throw (std::bad_alloc);
但是当我们使用这个运算符时,我们从不使用强制转换。 即
int *arr = new int;
那么,在这种情况下,C ++如何将void*
类型的指针转换为int*
。 因为,即使malloc
返回void*
,我们也需要显式地使用强制转换。
operator new
和new
运算符之间的C ++存在非常细微的差别。 (再看一遍......排序很重要!)
函数operator new
是C的malloc
函数的C ++模拟。 它是一个原始内存分配器,其职责仅仅是生成一块内存块来构造对象。 它不会调用任何构造函数,因为这不是它的工作。 通常,您不会看到在C ++代码中直接使用的operator new
; 它看起来有点奇怪。 例如:
void* memory = operator new(137); // Allocate at least 137 bytes
new
运算符是一个关键字,负责为对象分配内存并调用其构造函数。 这是C ++代码中最常见的。 当你写作
int* myInt = new int;
您正在使用new运算符来分配新的整数。 在内部, new
运算符的工作方式大致如下:
operator new
分配内存以保存请求的对象。 operator delete
释放上述内存,然后传播异常。 因为new
运算符和new
运算operator new
是分开的,所以可以使用new
关键字来构造对象而无需实际分配任何内存。 例如,着名的placement new允许您在用户提供的内存中的任意内存地址上构建对象。 例如:
T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'
通过定义自定义operator new
函数来重载new
运算符,可以以这种方式使用new
; 指定分配的方式,C ++编译器将它连接到new
运算符。
如果你很好奇, delete
关键字的工作方式相同。 有一个称为operator delete
的释放函数负责处理内存,还有一个delete
操作符负责调用对象析构函数和释放内存。 但是,例如,可以在这些上下文之外使用operator new
和operator delete
来代替C的malloc
和free
。
您将new
表达式与operator new()
函数混淆。 编译前者时,编译器会生成对operator new()
函数的调用,并传递足够大小以保存new
表达式中提到的类型,然后返回该类型的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.