Z
ZHANK
编程在线教程C++ 教程new/delete 动态内存
指针与内存

new/delete 动态内存

new/delete 替代 malloc/free、new[] 数组分配、定位 new

new/delete 动态内存

C++ 用 new/delete 代替 malloc/free——不仅分配内存,还会调用构造函数和析构函数。

学完本章你将: 掌握 new/delete、new[]/delete[]、与 malloc 的差异。


new 和 delete 基础

cpp
#include <iostream>

int main() {
    // 分配单个 int
    int *p = new int(42);    // 分配并初始化为 42
    std::cout << *p << "\n"; // 42
    delete p;                // 释放

    // 分配数组
    int *arr = new int[5]{1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << " ";
    }
    delete[] arr;            // 数组用 delete[]

    return 0;
}

new vs malloc

cpp
// C 方式(C++ 中不推荐)
int *c1 = (int *)malloc(sizeof(int));
free(c1);

// C++ 方式
int *c2 = new int;
delete c2;
malloc/freenew/delete
构造/析构不调用会自动调用
返回值void*(需转换)正确类型的指针
失败返回 NULL抛出 std::bad_alloc
是操作符函数运算符(可重载)

常见陷阱

cpp
// 1. 配对错误
int *p = new int[10];
// delete p;       // ❌ 应该用 delete[]
delete[] p;        // ✅

// 2. 忘记 delete → 内存泄漏
void leak() {
    int *p = new int(42);  // 忘记 delete
}

// 3. 重复 delete → 未定义行为
int *p = new int(42);
delete p;
// delete p;       // ❌ 不能重复释放
p = nullptr;       // 防御:释放后置 nullptr