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

asn*_*snr 3 c c++ pointers

在C中,对于调用的结果进行类型转换被认为是不好的形式malloc.但是,似乎malloc在C++ 中调用的结果应该是类型转换,即使两者都有malloc并且new返回类型void*和调用new都不是类型转换.有没有理由在C++中返回的void指针new被自动提升而返回的void指针malloc不是?

fre*_*low 14

你operator new对new运营商感到困惑.operator new只需分配原始内存并返回一个void*,new T然后在分配后调用构造函数并返回一个T*.

此外,您必须使用mallocC++转换结果,因为与C不同,C++不允许从void*其他指针类型进行隐式转换.请注意,void*在C++中很少使用.


Ker*_* SB 5

在C++中,内存位置确实是通过void指针来表达的。但内存与对象不同。对象需要内存才能生存,但该对象与其所在的内存不同。

您需要在内存中创建一个对象。如果愿意,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);
Run Code Online (Sandbox Code Playgroud)