悠悠楠杉
网站页面
标题:C++中手动管理堆内存:new和delete操作的正确用法
关键词:C++堆内存管理、new和delete、内存泄漏、智能指针、RAII
描述:本文详细讲解C++中手动管理堆内存的核心操作new和delete的正确用法,包括常见陷阱、最佳实践及替代方案,帮助开发者写出更安全的代码。
正文:
在C++中,手动管理堆内存是开发者必须掌握的核心技能之一。与Java、Python等语言不同,C++没有自动垃圾回收机制,内存管理完全依赖开发者。new和delete是直接操作堆内存的关键操作符,但若使用不当,轻则导致内存泄漏,重则引发程序崩溃。本文将系统性地介绍它们的正确用法及常见避坑指南。
new用于在堆上动态分配内存,并返回指向该内存的指针;delete用于释放内存,防止泄漏。以下是一个简单示例:
int* ptr = new int; // 分配一个int类型的内存
*ptr = 42; // 写入数据
delete ptr; // 释放内存
ptr = nullptr; // 避免悬空指针对于数组,需使用new[]和delete[]配对操作:
int* arr = new int[10]; // 分配10个int的数组
delete[] arr; // 释放数组内存delete会导致内存无法回收。例如:void leakMemory() {
int* ptr = new int(100);
// 忘记delete
}delete会引发未定义行为:int* p = new int;
delete p;
delete p; // 错误!nullptr,后续误用可能导致崩溃:int* p = new int;
delete p;
*p = 10; // 危险!class Resource {
public:
Resource() { data = new int[100]; }
~Resource() { delete[] data; }
private:
int* data;
};std::unique_ptr和std::shared_ptr可自动管理内存:#include
std::unique_ptr ptr = std::make_unique(42);
// 无需手动delete std::vector)或智能指针替代手动管理。new/delete开销。char buffer[sizeof(int)];
int* p = new (buffer) int(100);
p->~int(); // 手动调用析构函数