C++ delete 运算符
外观
C++ delete运算符[编辑 | 编辑源代码]
delete运算符是C++中用于释放动态分配内存的关键运算符,与`new`运算符配合使用。当使用`new`创建的对象不再需要时,必须使用`delete`释放内存以避免内存泄漏。
基本语法[编辑 | 编辑源代码]
delete运算符有两种形式:
1. 释放单个对象:
delete pointer;
2. 释放对象数组:
delete[] array_pointer;
工作原理[编辑 | 编辑源代码]
当调用`delete`时:
- 调用对象的析构函数(如果存在)
- 释放对象占用的内存
- 将指针标记为无效(但不会自动设为`nullptr`)
基础示例[编辑 | 编辑源代码]
单个对象删除[编辑 | 编辑源代码]
#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);
}
};
数学表示[编辑 | 编辑源代码]
内存释放过程可以表示为: 其中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没有内容。
切勿删除以下内存:
|