new和malloc在C和C++中的行为
Behaviour of new and malloc in C and C++
在C中,对malloc
调用的结果进行类型转换被认为是一种糟糕的形式。然而,C++中对malloc
的调用的结果似乎应该是类型转换的,即使malloc
和new
都有返回类型void*
,并且对new
的调用不是类型转换的。在C++中,new
返回的void指针会自动升级,而malloc
返回的void指示器则不会升级,这是有原因的吗?
您混淆了operator new
和new
运算符。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);
相关文章:
- 在使用malloc/new时无法编译stm32l4r5xx
- 如何使用 "new" 而不是 malloc 分配内存?
- Malloc vs New for Primitives
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 无法调用使用 malloc/placement new 创建的类上的虚函数
- 使用 new 而不是 malloc 分配 mem
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 正在使用new char[]或malloc的结果来铸造float*是UB(严格的混叠冲突)
- 此测试是否证明 malloc、calloc、new 在我的系统上管理自己的内存池?
- `delete []`on`int*````new'''给出了malloc错误
- 在混合 C/C++ 程序中协调 malloc 和 new 的"正确"方法是什么?
- 构造函数中的 Malloc 在通过 New 调用时返回 NULL
- 在 C++ 中将 malloc/free 替换为 new/delete
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- 如何将'malloc'和'free'替换为'new'和"删除"?
- malloc/new在函数指针内失败
- Malloc / new锁和多线程
- 为什么malloc/new捕获调用栈?