在 C 中,对调用的结果进行类型转换被认为是糟糕的形式malloc
。malloc
然而,在 C++中调用的结果似乎应该是类型转换的,即使两者malloc
都有new
返回类型void*
和调用new
不是类型转换。为什么在 C++ 中返回的 void 指针new
被自动提升而返回的 void 指针malloc
不是?
问问题
240 次
2 回答
14
您operator new
对new
运营商感到困惑。operator new
只是分配原始内存并返回 a void*
,而new T
在分配后也调用构造函数并返回 a T*
。
此外,您必须malloc
在 C++ 中转换结果,因为与 C 不同,C++ 不允许从隐式转换void*
到其他指针类型。请注意,这void*
在 C++ 中很少使用。
于 2013-02-16T13:24:44.460 回答
4
在 C++ 中,内存位置确实是通过 void 指针表示的。但是内存与对象不同。一个对象需要内存才能生存,但该对象不同于它所在的内存。
您需要在内存中创建一个对象。如果你愿意,new
-operator 在内存和对象之间“转换”:
#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);
于 2013-02-16T13:46:19.180 回答