C++内存操作符:new分配 与 delete释放
一. new操作符
1. 功能与语法
在C++中,new操作符用于动态分配内存。它的基本语法有两种形式:一种是分配单个对象的内存,例如int *p = new int;,这里new操作符在堆上分配了足够存储一个int类型对象的内存空间,并返回指向该内存空间的指针p;另一种是分配数组的内存,如int *arr = new int[5];,这会在堆上分配能够存储5个int类型元素的连续内存空间,arr指向这个数组的首元素。
2. 初始化
对于基本类型,可以在分配内存的同时进行初始化。例如int *p = new int(10);,这里不仅分配了一个int类型的内存空间,还将这个空间初始化为10。对于自定义类型(类类型),如果类有合适的构造函数,new操作符会调用构造函数来初始化对象。例如:
1 2 3 4 5 6 | class MyClass { public : MyClass( int num) : value(num) {} int value; }; MyClass *obj = new MyClass(20); |
二. delete操作符
1. 功能与语法
delete操作符用于释放由new操作符动态分配的内存。对于单个对象的内存释放,语法为delete p;,其中p是由new分配的单个对象的指针。例如,对于前面分配的int类型指针p(int *p = new int;),使用delete p;来释放内存。对于数组的内存释放,语法为delete[] arr;,其中arr是由new分配数组内存的指针。例如,对于int *arr = new int[5];,使用delete[] arr;来释放数组内存。
2. 注意事项
如果使用delete时不匹配(用delete释放数组内存或者用delete[]释放单个对象内存),会导致未定义行为。例如,如果对int *arr = new int[5];使用delete arr;(而不是delete[] arr;),可能会导致内存泄漏或者程序崩溃等问题。
不能对同一个指针多次调用delete操作符,这也会导致未定义行为。例如:
1 2 3 4 | int *p = new int ; delete p; // 以下操作是错误的 delete p; |
三. 内存管理的重要性与潜在问题
1. 内存泄漏
如果动态分配的内存没有被正确释放(例如,忘记调用delete或delete[]),就会导致内存泄漏。内存泄漏会使程序占用的内存不断增加,最终可能导致系统内存耗尽。例如:
1 2 3 4 | void leakMemory() { int *p = new int ; // 没有释放p所指向的内存,函数结束后,这块内存无法被再次使用 } |
2. 悬空指针
在释放内存后,如果没有将指针设置为nullptr(C++11及以上)或者其他合适的值,指针就会变成悬空指针。悬空指针指向的是已经被释放的内存区域,对悬空指针进行解引用操作会导致未定义行为。例如:
1 2 3 4 5 | int *p = new int ; delete p; // p现在是悬空指针 // 以下操作是危险的 *p = 10; |
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线