内存分配
堆与栈
- 在程序中定义一个变量,如果没有申请动态分配方式,它的值将放到栈中。
- 栈中的变量所属的内存大小无法被改变,它们内存的分配和释放与变量定义的位置和存储类型相关。
- 在程序中申请一个动态分配内存方式定义一个变量,则会把该变量的值放入堆中,根据需要,该变量内存的大小可以改变,内存的申请和销毁都是可控制。
关键字:new , delete
- var = new type
- delete var
#include <iostream>
using namespace std;
int main()
{
int* ptr1 = NULL , *ptr2 ;
ptr1 = new int;
// ptr1 申请了动态分配,使用的是栈中的内存
// ptr2 获取堆中的内存地址,属于静态分配
*ptr1 = 2;
*ptr2 = 1;
cout << " ptr1 = " << ptr1 << "*ptr1= " << *ptr1 << endl;
cout << " ptr2 = " << ptr2 << "*ptr2= " << *ptr2 << endl;
// error
return 0;
}
- 在申请内存之后需要手动释放,因为程序不会在执行时自动销毁。
内存安全
- 当一块内存被释放时,该区域不可复用,如果有指针指向该区域则需要将该指针指向未被释放的内存或者NULL。
- 内存销毁实质上是系统判定该内存不是编程人员正常使用的空间,系统也会将它分配给别的任务;如果擅自使用被销毁内存的指针更改该内存的数据可能会造成严重的后果。
- 内存泄漏:当没有指针指向未被释放的堆内存时,这块内存无法复用。
关于指针的说明
指针是一种灵活高效的内存访问机制,但是指针无法访问寄存器变量,因为寄存器变量没有保存在内存中。