new和malloc在C和C++中的行为

Behaviour of new and malloc in C and C++

本文关键字:malloc new C++      更新时间:2023-10-16

在C中,对malloc调用的结果进行类型转换被认为是一种糟糕的形式。然而,C++中对malloc的调用的结果似乎应该是类型转换的,即使mallocnew都有返回类型void*,并且对new的调用不是类型转换的。在C++中,new返回的void指针会自动升级,而malloc返回的void指示器则不会升级,这是有原因的吗?

您混淆了operator newnew运算符。operator new只分配原始内存并返回一个void*,而new T也在分配后调用构造函数并返回一条T*

此外,您必须在C++中强制转换malloc的结果,因为与C不同,C++不允许从void*隐式转换为其他指针类型。注意,void*在C++中很少使用。

在C++中,内存位置实际上是通过空指针来表示的。但是记忆和物体是不一样的。对象需要内存才能生存,但该对象与其所在的内存不同。

您需要在内存中创建一个对象。如果你愿意,new操作符在内存和对象之间"转换":

#include <cstdlib>
void * pm = std::malloc(sizeof(int));       // C-style
void * qm = ::operator new(sizeof(int));    // C++-style
int * po = ::new (pm) int(10);              // void pointer goes in...
int * qo = ::new (qm) int(20);              // ...object pointer comes out.
// (... class-type objects would need to be destroyed...)
std::free(pm);
::operator delete(qm);