你不应该malloc在C++中使用.你应该使用new.事实上,您可能不应该使用new(对于C++中的大多数基本编程).但仍然有一个基本的例子是声明一个数组:int* array = new int[n].这将为n个整数分配空间并返回指向第一个地址的指针.请注意,您必须明确调用delete[]以释放此分配.
大多数情况下,你根本不应该使用它.C++提供new与delete运营商的存储器管理,并且甚至delete可以通过使用智能指针如在很大程度上避免boost::shared_ptr从Boost库.
例:
// malloc
Duck* duck = (Duck*)malloc(sizeof(Duck));
// new
Duck* duck = new Duck();
Run Code Online (Sandbox Code Playgroud)
还要注意,如果Duck类有一个非平凡的构造函数,那么new几乎是强制性的.(几乎,因为你可以使用malloc放置new,但这将使我们离开主轨道).
问题 1:“如何从 C++ 调用 malloc?”
这两个之一:
#include <cstdlib>
...
int *iptr = (int*) std::malloc(sizeof(*iptr));
#include <stdlib.h>
...
int *iptr = (int*) malloc(sizeof(*iptr));
Run Code Online (Sandbox Code Playgroud)
与 C 一样,sizeof(int)如果您愿意,您可以使用,而不是sizeof(*iptr).
但是请注意,如果您使用cstdlib. 正如尼尔所说,几乎所有的实现都<cstdlib>将放在malloc全局命名空间中,但这不是由标准保证的。
还需要(真正的)强制转换,因为 C++ 缺少 Cvoid*到其他指针类型的自动转换。您可以使用 astatic_cast而不是 C 风格的强制转换,但就我个人而言,在这种情况下我不明白这一点。
正如每个人所说,malloc在 C++ 中使用的理由很少。与需要 malloced 指针的 C 代码接口(因为 C 代码将释放它)是一个很好的理由,但如果这两位代码在不同的 dll 中,即使在那里你也会遇到麻烦。
问题 2:“我如何在 C++ 中分配内存?”
通常你会这样做:
int *iptr = new int;
int *intarrayptr = new int[23];
delete iptr;
delete[] intarrayptr;
Run Code Online (Sandbox Code Playgroud)
或者要将原始数据用于某些无法表示为 C++ 对象/数组的邪恶目的,请执行以下操作:
unsigned char *twentythreebytes = (unsigned char*) ::operator new(23);
::operator delete(twentythreebytes);
Run Code Online (Sandbox Code Playgroud)
然而,像这样从堆分配内存在(精心设计的、高级的)C++ 代码中也很少见。在可能的情况下,首选自动变量或成员变量和标准容器:
#include <vector>
...
std::vector<int> intarray(23);
// no need to delete: the array will be destroyed when it goes out of scope.
Run Code Online (Sandbox Code Playgroud)