动态分配内存

动态分配内存

整理自《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运算符来确定动态分配的数组包含的字节数。
指针和数组名的区别。不能修改数组名的值。但指针是变量,因此可以修该它的值。

原文地址:https://www.cnblogs.com/adtxl/p/11491838.html