牢记,用 new 运算符动态分配的内存空间,一定要用 delete 运算符释放。否则,即便程序运行结束,这部分内存空间仍然不会被操作系统收回,从而成为被白白浪费掉的内存垃圾。这种现象也称为“内存泄露”。<br /> 如果一个程序不停地进行动态内存分配而总是没有释放,那么可用内存就会被该程序大量消耗,即便该程序结束也不能恢复。这就会导致操作系统运行速度变慢,甚至无法再启动新的程序。但是,只要重新启动计算机,这种情况就会消失。<br /> 编程时如果进行了动态内存分配,那么一定要确保其后的每一条执行路径都能释放它。<br /> 另外还要注意,释放一个指针,并不会使该指针的值变为 NULL。
[1.x] new
- new 的本质是运算符- 如果自由存储区已被用完,可能无法成功分配内存, new 可能会返回NULL - 与 malloc() 相比,new 的优点是它除了分配了内存,还创建了对象1. **T *ptr = new T** - 其中 T 为 Type Name - 效果是动态分配一块大小为 **sizeof(T)** 的内存,并获得其地址2. **T *ptr = new T[N]** - 其中 T 为 Type Name- 其中 N 为 任意正值表达式(这意味着N 中可以存在变量、函数、运算符等)- 效果是动态获得 **N** 块大小为**sizeof(T)** 的内存,并获得该数组的首地址- 如果要求分配的空间太大,操作系统找不到足够的内存来满足,那么动态内存分配就会失败,此时程序会拋出异常 |
---|
[2.x] delete
- delete 的本质是运算符- delete 的操作指针必须指向动态分配的内存空间1. **delete ptr** - 其中 ptr 指向一个动态分配的内存空间- 效果是释放该动态分配的内存 2. **delete[] ptr** - 其中 ptr 指向一个动态分配的数组的内存空间的首地址(否则会抛出异常)- 效果是释放该动态分配的数组的内存 |
---|