在C中,对malloc
的调用结果进行类型转换是considered poor form。但是,即使malloc
和malloc
都返回类型new
,但在C ++ 中调用void*
的结果似乎是类型转换的。并且对new
的调用不是类型转换。是否有理由在C ++中由new
返回的void指针自动提升而malloc
返回的void指针不是?
答案 0 :(得分:14)
您将operator new
与new
运算符混淆。 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);