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

时间:2013-02-16 13:22:20

标签: c++ c pointers

在C中,对malloc的调用结果进行类型转换是considered poor form。但是,即使mallocmalloc都返回类型new,但在C ++ 中调用void*的结果似乎是类型转换的。并且对new的调用不是类型转换。是否有理由在C ++中由new返回的void指针自动提升而malloc返回的void指针不是?

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:4)

在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);