new操作符
用new操作符在堆区开辟数据,该数据由程序员手动开辟,手动释放(释放操作符delete)
基本语法:举例
new
操作符的基本用法
new 数据类型
int * func()
{
// 在堆区创建整型数据
// new返回的是该数据类型的指针
int * p = new int(10);
return p;
}
void test01()
{
int * p = func();
cout << *p << endl;
}
利用new创建的数据,会返回该数据对应类型的指针.
delete p ; //释放堆区数据
在堆区利用new
操作符开辟一个整型数组
void test02()
{
// 创建10整型数据的数组,在堆区
int * arr = new int[10]; // 10代表数组有10个元素
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100; // 给10个元素赋值 100 ~ 109
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
}
int * arr = new int[10];
-
功能:在堆区动态分配一个包含10个整型元素的数组。
-
关键点:
-
new int[10]
:分配一个包含10个int
类型元素的数组。 -
int * arr
:arr
是一个指向int
类型的指针,用于存储数组的首地址
-
释放堆区数组
// 释放堆区数组
// 释放数组的时候 要加 [] 才可以
delete[] arr;
AI版笔记-new操作符
1. 核心作用
-
堆内存动态分配:
new
在堆区动态分配内存(需手动管理生命周期)。 -
返回指针:返回对应数据类型的指针,通过指针操作内存。
-
适用场景:数据较大、需跨函数生命周期存在时使用。
2. 基本语法
2.1 创建单个对象
数据类型* 指针名 = new 数据类型(初始化值);
-
示例:
int* p = new int(10); // 分配一个int,初始化为10 char* c = new char('A'); // 分配一个char,初始化为'A'
2.2 创建数组
数据类型* 指针名 = new 数据类型[数组长度];
-
示例:
int* arr = new int[10]; // 分配10个int的数组(未初始化) // C++11 支持初始化列表: int* arr2 = new int[5]{1,2,3,4,5}; // 分配并初始化
3. 内存释放
3.1 释放单个对象
delete 指针名;
-
示例:
delete p; // 释放单个int
3.2 释放数组
delete[] 指针名;
-
示例:
delete[] arr; // 释放数组
4. 完整代码示例
4.1 单个对象操作
#include <iostream>
using namespace std;
int* createInt() {
int* p = new int(42); // 堆区分配int
return p;
}
void demoSingle() {
int* ptr = createInt();
cout << *ptr << endl; // 输出: 42
delete ptr; // 必须手动释放
}
4.2 数组操作
void demoArray() {
int* arr = new int[5]{10,20,30}; // 前3个元素初始化,其余为0
for (int i=0; i<5; i++) {
arr[i] += i; // 修改数组值
}
delete[] arr; // 正确释放数组
}
5. 注意事项
-
内存泄漏
忘记delete
会导致内存泄漏。确保每次new
都有对应的释放操作。 -
数组释放语法
必须使用delete[]
释放数组,否则行为未定义(可能只释放第一个元素)。 -
初始化差异
-
单个对象:可通过
new int(值)
直接初始化。 -
数组:C++11 支持
new int[n]{...}
,未初始化的元素默认为0。
-
-
异常处理
new
可能因内存不足抛出std::bad_alloc
异常。可用nothrow
版避免异常:int* p = new (nothrow) int(10); // 失败时返回nullptr if (!p) { /* 处理错误 */ }
-
与
malloc
区别-
new
调用构造函数,malloc
不调用。 -
new
是运算符,malloc
是库函数。
-
6. 堆区 vs 栈区
特性 | 堆区 (Heap) | 栈区 (Stack) |
---|---|---|
生命周期 | 手动控制 (new/delete ) | 自动管理(作用域结束释放) |
分配速度 | 较慢(需查找可用内存) | 极快(指针简单移动) |
空间大小 | 受系统内存限制 | 较小(默认约1-8MB) |
碎片化风险 | 高(频繁分配释放) | 无 |
其他问题
代码 | 用途 | 注意事项 |
---|---|---|
#include <iostream> | 启用输入输出功能(如cout/cin) | 必须包含,否则无法使用IO操作 |
using namespace std; | 简化代码(省去std::前缀) | 避免在大型项目/头文件中使用 |