动态分配内存
动态分配内存
整理自《C++ Primer Plus》
1. 指针和自由存储空间
- 变量的本质是一段连续内存空间的别名。使用引用可以有多个别名。
- *运算符被称为间接值或解除引用运算符,将其应用于指针,可以得到该地址处存储的值。
- 在32位系统下,指针占4个字节,64位系统下指针占8个字节
- 指针的危险。 在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据内存。
long *fellow; // create a pointer to long
*fellpw = 23333; // place a value in never-never land
警告: 一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
-
使用new来分配内存。
变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供一个别名。指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在C语言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但C++还有更好的方法——new运算符。
new int 告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少字节的内存。然后它找到这样的内存,并返回其地址。 -
**使用delete释放内存 **
使用delete时,后面要加上指向内存块的指针,这将释放ps指向的内存,但不会删除指针ps本身。一定要配对地使用new和delete;否则将发生内存泄漏,也就是说,被分配的内存再也无法使用。如果内存泄漏严重,则程序将由于不断寻找更多内存而终止。
不要尝试释放已经释放的内存块
int *ps = new int; // ok
delete ps; // ok
delete ps; // not ok now
int jugs = 5; // ok
int *pi = &jugs; // ok
delete pi; // not allowed, memory not allocated by new
警告: 只能用delete来释放使用new分配的内存。然而,对空指针使用delete是安全的。
使用静态联编时,必须在编写程序时指定数组的长度;使用动态联编时,程序在运行时确定数组的长度。
不能使用sizeof运算符来确定动态分配的数组包含的字节数。
指针和数组名的区别。不能修改数组名的值。但指针是变量,因此可以修该它的值。