cpp自学 day10 (程序内存模型-new操作符)

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 * arrarr是一个指向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. 注意事项
  1. 内存泄漏
    忘记 delete 会导致内存泄漏。确保每次 new 都有对应的释放操作。

  2. 数组释放语法
    必须使用 delete[] 释放数组,否则行为未定义(可能只释放第一个元素)。

  3. 初始化差异

    • 单个对象:可通过 new int(值) 直接初始化。

    • 数组:C++11 支持 new int[n]{...},未初始化的元素默认为0。

  4. 异常处理
    new 可能因内存不足抛出 std::bad_alloc 异常。可用 nothrow 版避免异常:

    int* p = new (nothrow) int(10);  // 失败时返回nullptr
    if (!p) { /* 处理错误 */ }
  5. 与 malloc 区别

    • new 调用构造函数,malloc 不调用。

    • new 是运算符,malloc 是库函数。


6. 堆区 vs 栈区
特性堆区 (Heap)栈区 (Stack)
生命周期手动控制 (new/delete)自动管理(作用域结束释放)
分配速度较慢(需查找可用内存)极快(指针简单移动)
空间大小受系统内存限制较小(默认约1-8MB)
碎片化风险高(频繁分配释放)

其他问题

代码用途注意事项
#include <iostream>启用输入输出功能(如cout/cin)必须包含,否则无法使用IO操作
using namespace std;简化代码(省去std::前缀)避免在大型项目/头文件中使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值