亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 动态内存管理:new 与 delete 专家级实战指南

C++ 动态内存管理:new 与 delete 专家级实战指南

本指南通过真实案例详解 C++ 堆内存分配与释放,涵盖 new/delete、new[]/delete[]、对象动态创建及智能指针现代替代方案。

C++ 赋予开发者运行时分配内存的能力——即动态内存分配。与 Java、Python 等托管语言不同,C++ 不自动回收堆内存,程序员必须显式释放。

new 与 delete 运算符是手动内存管理的基石,定义于 C++ 标准库。


new 运算符

new 在堆上分配内存块,返回指向首字节的指针:

// 声明 int 指针
int* pointVar;
// 动态分配一个 int
pointVar = new int;
// 给分配的内存赋值
*pointVar = 45;

pointVar 接收新分配 int 的地址。因 new 返回指针,变量必须是指针类型。数组分配返回指向首元素的指针:

int* arr = new int[10];  // arr 指向包含 10 个 int 的数组首元素

通用语法:

pointerVariable = new DataType;        // 单个对象
pointerVariable = new DataType[Size];  // 数组

delete 运算符

不再需要 new 分配的内存时,必须调用 delete 归还操作系统,否则会导致内存泄漏,引发性能下降或崩溃。

单个对象:

delete pointerVariable;

数组(配合 new[]):

delete[] pointerVariable;

完整生命周期示例:

// 分配 int
int* pointVar = new int;
*pointVar = 45;
cout << *pointVar;  // 输出: 45
// 释放
delete pointVar;

提示: 每个 new 必须配对 delete(数组用 delete[])。生产代码中应优先使用 RAII 或智能指针(如 std::unique_ptr)自动管理生命周期。


示例 1:基本动态分配

#include <iostream>
using namespace std;

int main() {
    int* pointInt;
    float* pointFloat;
    pointInt = new int;
    pointFloat = new float;
    *pointInt = 45;
    *pointFloat = 45.45f;
    cout << *pointInt << endl;
    cout << *pointFloat << endl;
    delete pointInt;
    delete pointFloat;
    return 0;
}

输出

45
45.45

演示了两个基本类型的分配、赋值、输出与释放全流程。

注意: 当数组大小运行时才确定时,动态分配极具灵活性优势。


示例 2:动态分配浮点数组

#include <iostream>
using namespace std;

int main() {
    int num;
    cout << "Enter total number of students: ";
    cin >> num;
    float* ptr = new float[num];
    cout << "Enter GPA of students." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Student" << i + 1 << ": ";
        cin >> *(ptr + i);
    }
    cout << "\nDisplaying GPA of students." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Student" << i + 1 << " :" << *(ptr + i) << endl;
    }
    delete[] ptr;  // 必须用 delete[] 释放数组
    return 0;
}

输出

Enter total number of students: 4
Enter GPA of students.
Student1: 3.6
Student2: 3.1
Student3: 3.9
Student4: 2.9
Displaying GPA of students.
Student1 :3.6
Student2 :3.1
Student3 :3.9
Student4 :2.9

程序根据用户输入的学生数动态分配数组,录入数据、显示,最后用 delete[] 释放内存。


示例 3:动态分配对象

#include <iostream>
using namespace std;

class Student {
    int age;
public:
    Student() : age(12) {}
    void getAge() {
        cout << "Age = " << age << endl;
    }
};

int main() {
    Student* ptr = new Student();
    ptr->getAge();
    delete ptr;
    return 0;
}

输出

Age = 12

在堆上创建 Student 对象,构造函数初始化 age 为 12,调用 getAge 打印,最后 delete 释放对象内存。

现代 C++ 最佳实践

C语言

  1. GE Digital发布预测性资产管理软件,推动维护从反应式转向主动式
  2. 树莓派 3 B+ – 更新特性、规格与选购指南
  3. Wittmann Battenfeld 推出 X 系列高端机器人与 Primus 14 经济型机型
  4. 数字存储器基础:寻址、访问与易失性
  5. C++结构体与类:嵌入式开发者实战指南
  6. 掌握 C++ 变量、字面量与常量:核心概念与实战指南
  7. C++类与对象:面向对象编程实战指南
  8. C++ 三种继承方式深度解析:public、protected 与 private
  9. C++ 友元函数与友元类:突破访问控制的利器
  10. C 语言动态内存管理:calloc、malloc 与 free 完全解析
  11. C++日期时间完全指南:ctime库、tm结构体与格式化输出
  12. 精通 Python 目录与文件操作