一.new与delete
c++内存分配的两种方式:静态分配和动态分配
静态分配是在编译时分配相应的存储空间,因为是在编译时分配,要求编译时空间大小明确,数组长度必须为常量,一旦编译完成,这个数组的长度就是固定不变的。
动态分配是程序运行期间根据实际需要动态申请或释放内存。它不需要预先分配存储空间,分配的空间可以扩大或缩小
使用malloc和free动态申请和释放内存:
*new运算符结果是指向分配得到的内存空间的指针,如果没有足够的内存空间可以分配,其运算结果是一个0值指针。
销毁对象后,指针p1变成了没有定义,然而它羽然存放所指向对象的地址,所以指针p1不再有效,被称为迷途指针,通常在delete运算后将其设为NULL即0值指针,避免了迷途指针;
用new创建的动态对象使用完后,必须用delete销毁它。
delete只能删除由new创建的动态对象,否则将导致程序错误。
静态内存管理有编译器进行,程序员只是做対象定义(相当于分配),但是动态分配是按照程序员人为的指令进行。
动态分配和释放必须对应,不释放会内存泄漏,后果是随着程序运行多次,可以使用的内存空间越来越少,而释放已经释放的内存会导致程序奔溃
静态分配内存的生命期由编译器自动确定,要么是程序运行期,要么是函数执行期。动态分配内存的生命期由程序员决定,即从分配时开始,至释放时结束。特别地,动态分配内存的生命期允许跨多个函数。
静态分配内存的对象有初始化,动态分配内存一般需要人为
的指令赋初始值
避免释放内存后出现“迷途指针”,应及时设置为空指针*
2.动态分配内存应用
2.1动态分配数组
- 使用动态内存,可以轻而易举的解决在程序运行中产生任意大小的数组
动态分配一维或多维数组的方法是由指针管理数组,二维以上数组按一维数组方式来处理,具体步骤为:
①定义指针p;
②分配数组空间,用来存储数组元素,空间大小按元素个数计算;
③按一维数组方式使用这个数组(例如输入、输出等);若是一维数组,则元素为p[i];若是二维数组则元素为p[i*M+j],其中M为列元素个数,以此类推。
④释放数组空间;- 例 :计算N*N 二维数组的平均值
- -
2.2 动态分配字符串
- 实际编程中,字符串类型表示文字信息数据,其特点是字符长度不
固定。通过动态分配字符串,根据程序的需要确定字符串的实际长
度。 - 动态分配字符串的方法是由字符指针管理字符串,具体步骤为:
①定义字符指针; ②分配字符串空间,用来存储字符串; ③使用这个字符串(例如输入、输出等); ④释放字符串空间
- 例 :计算N*N 二维数组的平均值