new 这个关键字我们经常会用到无论是在 c++ 还是在像 java 或 c# 这样的高级语言我们无时无刻都会用到 new,因为太熟悉了,所以也就不以为然,可能以为太熟悉太自然反而让我们了解 new 的背后发生什么并不多。c++ 是效率的代言人,所以我们要用 c++ 而没有选择易学易用的高级语言。我们的目的一定是追求程序的性能。所以我们在设计程序和开发过程中一定要内存上多花一些心事,要不还不如选择 java 这样高级语言来实现。
如果很好地操作内存和利用内存,理解 new 就显得尤为重要。new 中表示在堆内存上分配内存给变量。使用 new 时候后面会跟基本类型或者 class。new int
表示我们分配 4 字节内存给变量。系统根据请求找到连续的 4 字节内存,然后将内存地址返回给变量。
int a = 2;
int *b = new int;
用new
来分配内存后返回一个内存地址指针b
。
int *b = new int[50]; // 200 bytes
class Pointer
{
private:
String m_Name;
public:
Pointer() : m_Name("Unknown") {}
Pointer(const String &name) : m_Name(name) {}
const String &GetName() const { return m_Name; }
};
想要给 Pointer 的实例分配内存可以使用 new Pointer()
,也可以写成new Pointer
。
Pointer *p = new Pointer();
Pointer *p = new Pointer;
想要定义 Pointer 数组,就可以这样来定义Pointer *arr = new Pointer[50];
。
Pointer *p = new Pointer();
Pointer *arr = new Pointer[50];
使用 new 来给 class 分配内存其实做了两件事—分配内存和调用构造函数
-
String m_Name;
根据 Pointer 类的属性成员给类分配内存大小 - 这里
new Pointer[50];
分配的内存是连续的,这一点希望大家清楚。
同样malloc
方法可以分配并返回指针。
malloc(50);
既然malloc
和new
具有相同的功能,我们就可以用malloc
来实现对内存的分配。
Pointer *p = new Pointer;
Pointer *p2 = (Pointer *)malloc(sizeof(Pointer));
我们可以这样改写,但是 new
和 malloc
还是有区别的 malloc
只是分配内存并没有像new
那样调用Pointer
的构造函数。
我们无论使用 new
还是malloc
分配内存给变量都需要手动来释放内存,
new
需要使用 delete
,如果是数组变量delete[]
来显式地释放内存,随后我们还会了解更多的策略来释放内存。
int main(int argc, char const *argv[])
{
int a = 2;
int *b = new int[50]; // 200 bytes
Pointer *p = new Pointer;
Pointer *p2 = (Pointer *)malloc(sizeof(Pointer));
delete p;
delete[] b;
free(p2);
std::cin.get();
}
也可以显式地分配给内存 p 。
int *b = new int[50]; // 200 bytes
Pointer *p = new(b) Pointer;