众所周知,如果我们使用new向系统申请了内存,我们应该使用指针指向这一块内存,俾能我们使用结束后,通过delete该指针释放此内存资源。
如果理解只达到这种程度,在内存管理稍微复杂一点时便一定会束手无策。总有一些事情比其他事情更基本一点,现在我来谈谈当我们new和delete之后到底发生了什么。
C++中的五种内存
在C++中内存分为五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。
- 堆区:用户使用new获得的内存在这里。用户需要自行管理其声明周期,也就是说一个new要对应一个delete,如果因为某些原因(之后我会说明一些可能的原因)内存没有被释放,那么在程序结束后,会由操作系统自行回收,这显然不是我们想看到的。
- 栈区:存储局部变量、函数参数等,比方说你在某个函数里定义了一个int变量a,这个a就存放在栈区。这块内存的生命周期由系统管理,不需要我们去操心。
- 自由存储区:用malloc分配的内存放置在这里。这块内存和堆很相似,不过是使用free来释放内存的。
- 全局/静态存储区:存放全局变量和静态变量。
- 常量存储区:存放常量,不允许更改。
new和delete
回到我们的主题。先看一段代码:
int *p = new int;
cout << *p << endl;//输出-842150451
cout << &p << endl;//输出004FFC14
*p = 1;
cout <