我在查看 new 操作符的签名。它是:
void* operator new (std::size_t size) throw (std::bad_alloc);
但是当我们使用这个运算符时,我们从来没有用过强制类型转换。也就是说
int *arr = new int;
那么,在这种情况下C++如何将类型为void*
的指针转换为int*
?因为即使malloc
返回void*
,我们仍需要明确使用类型转换。
我在查看 new 操作符的签名。它是:
void* operator new (std::size_t size) throw (std::bad_alloc);
但是当我们使用这个运算符时,我们从来没有用过强制类型转换。也就是说
int *arr = new int;
那么,在这种情况下C++如何将类型为void*
的指针转换为int*
?因为即使malloc
返回void*
,我们仍需要明确使用类型转换。
operator new
和new
操作符之间有一个非常微妙的区别。(请再次阅读...顺序很重要!)
operator new
函数是C++中malloc
函数的类比。它是一个原始内存分配器,其责任仅仅是生成一块内存来构建对象。它不会调用任何构造函数,因为这不是它的工作。通常情况下,在C++代码中你不会直接看到operator new
的使用;它看起来有些奇怪。例如:void* memory = operator new(137); // Allocate at least 137 bytes
new
运算符是一个关键字,用于为对象分配内存并调用其构造函数。这在C++代码中最常见。当你写下以下代码时:int* myInt = new int;
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
表达式中提到的类型的大小,然后返回该类型的指针。