问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++一分钟之-动态内存管理:new与delete

创作时间:
作者:
@小白创作中心

C++一分钟之-动态内存管理:new与delete

引用
1
来源
1.
https://developer.aliyun.com/article/1541209

在C++编程中,动态内存管理是一项核心技能。本文将深入浅出地讲解new与delete操作符的使用方法,剖析常见问题与易错点,并通过实例代码展示如何避免这些陷阱。

动态内存分配基础

new操作符

  • 基本用法:new用于在堆上分配内存,返回所分配内存的首地址。例如,
    int *p = new int;
    分配一个整型大小的内存,并将地址赋给指针p。

  • 初始化分配:new还可以直接初始化分配的内存,如
    int *p = new int(10);
    初始化为10。

  • 数组分配:分配数组时使用new[],如
    int *arr = new int[5];
    分配一个包含5个整数的数组。

delete操作符

  • 释放单个对象:delete p;
    释放由p指向的内存。

  • 释放数组:释放数组时必须使用delete[],如
    delete[] arr;
    ,否则会导致未定义行为。

常见问题与易错点

1. 内存泄漏

问题描述:分配的内存没有被及时释放。

示例

void function() {
    int *ptr = new int;
    // ...操作ptr
    // 忘记释放ptr指向的内存
}

避免方法:确保每一块new分配的内存都有对应的delete,使用智能指针可以自动管理内存。

2. 悬挂指针

问题描述:指向已释放内存的指针。

示例

int *ptr = new int;
delete ptr;
// ptr现在是一个悬挂指针,如果再次使用可能导致未定义行为
cout << *ptr;

避免方法:释放内存后立即将指针置为nullptr,如
delete ptr; ptr = nullptr;

3. 误用delete与delete[]

问题描述:使用delete释放数组内存或使用delete[]释放单个对象的内存。

示例

int *arr = new int[5];
delete arr; // 错误,应使用delete[]

避免方法:严格区分对象和数组的释放方式,遵循分配与释放匹配的原则。

4. 重复释放内存

问题描述:对同一块内存多次执行delete或delete[]操作。

示例

int *ptr = new int;
delete ptr;
delete ptr; // 重复释放,错误

避免方法:释放后立即将指针置为nullptr,或者使用智能指针避免手动管理内存。

实践代码示例

下面的代码演示了如何正确使用new与delete,并利用智能指针避免内存管理错误:

#include <iostream>
#include <memory>
void properMemoryManagement() {
    // 使用unique_ptr自动管理单个对象的内存
    std::unique_ptr<int> ptr(new int(10));
    std::cout << *ptr << std::endl;
    // 使用unique_ptr管理数组
    std::unique_ptr<int[]> arr(new int[5]{1, 2, 3, 4, 5});
    for(int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
    // 不需要手动调用delete,智能指针自动处理
}
int main() {
    properMemoryManagement();
    return 0;
}

通过上述内容,我们不仅学习了new与delete的基本用法,还深入探讨了动态内存管理中常见的问题与解决方案。掌握这些原则,结合实践中的不断应用,你将能够在C++编程中更加游刃有余地控制内存,编写出既高效又健壮的代码。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号