跳转到内容

C++ delete 运算符

来自代码酷

模板:Note

C++ delete运算符[编辑 | 编辑源代码]

delete运算符是C++中用于释放动态分配内存的关键运算符,与`new`运算符配合使用。当使用`new`创建的对象不再需要时,必须使用`delete`释放内存以避免内存泄漏。

基本语法[编辑 | 编辑源代码]

delete运算符有两种形式:

1. 释放单个对象:

delete pointer;

2. 释放对象数组:

delete[] array_pointer;

工作原理[编辑 | 编辑源代码]

当调用`delete`时:

  1. 调用对象的析构函数(如果存在)
  2. 释放对象占用的内存
  3. 将指针标记为无效(但不会自动设为`nullptr`)

graph TD A[调用delete] --> B[执行析构函数] B --> C[释放内存] C --> D[指针变为悬垂指针]

基础示例[编辑 | 编辑源代码]

单个对象删除[编辑 | 编辑源代码]

#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "构造函数调用\n"; }
    ~MyClass() { std::cout << "析构函数调用\n"; }
};

int main() {
    MyClass* ptr = new MyClass();  // 动态分配
    delete ptr;                    // 释放内存
    return 0;
}

输出:

构造函数调用
析构函数调用

数组删除[编辑 | 编辑源代码]

必须使用`delete[]`释放数组:

int main() {
    int* arr = new int[10];  // 分配10个整数的数组
    delete[] arr;            // 正确释放方式
    return 0;
}

常见错误与注意事项[编辑 | 编辑源代码]

错误1:错误配对[编辑 | 编辑源代码]

int* p = new int;
delete[] p;  // 未定义行为!

int* arr = new int[10];
delete arr;  // 未定义行为!

错误2:重复删除[编辑 | 编辑源代码]

int* p = new int;
delete p;
delete p;  // 程序崩溃!

最佳实践[编辑 | 编辑源代码]

1. 删除后立即将指针设为`nullptr`:

delete ptr;
ptr = nullptr;

2. 使用RAII(资源获取即初始化)技术替代裸`new`/`delete`:

#include <memory>
std::unique_ptr<int> smartPtr(new int(42));
// 不需要手动delete

高级主题[编辑 | 编辑源代码]

自定义删除器[编辑 | 编辑源代码]

C++允许为智能指针指定自定义删除器:

void customDeleter(int* p) {
    std::cout << "自定义删除\n";
    delete p;
}

std::unique_ptr<int, decltype(&customDeleter)> ptr(new int, customDeleter);

重载delete运算符[编辑 | 编辑源代码]

可以重载类特定的`delete`运算符:

class MyClass {
public:
    static void operator delete(void* ptr) {
        std::cout << "自定义delete\n";
        ::operator delete(ptr);
    }
};

数学表示[编辑 | 编辑源代码]

内存释放过程可以表示为: delete:Pointer×HeapHeap 其中Heap' = Heap - allocated_block(pointer)

实际应用案例[编辑 | 编辑源代码]

游戏开发中的资源管理[编辑 | 编辑源代码]

class Texture {
    unsigned char* data;
public:
    Texture(size_t size) { data = new unsigned char[size]; }
    ~Texture() { delete[] data; }
    // ...其他方法...
};

void loadLevel() {
    Texture* levelTexture = new Texture(1024*1024);
    // 使用纹理...
    delete levelTexture;  // 关卡卸载时释放
}

性能考虑[编辑 | 编辑源代码]

1. `delete`操作的时间复杂度通常是O(1),但可能触发操作系统级的内存回收 2. 频繁的`new`/`delete`会导致内存碎片 3. 内存池技术可以优化频繁的小对象分配/释放

页面模块:Message box/ambox.css没有内容。