# C++中的new和delete怎么用
## 目錄
1. [引言](#引言)
2. [內存管理基礎](#內存管理基礎)
3. [new操作符詳解](#new操作符詳解)
- [基本語法](#基本語法)
- [數組分配](#數組分配)
- [定位new](#定位new)
4. [delete操作符詳解](#delete操作符詳解)
- [基本語法](#基本語法-1)
- [數組釋放](#數組釋放)
5. [new/delete與malloc/free的區別](#newdelete與mallocfree的區別)
6. [常見問題與陷阱](#常見問題與陷阱)
- [內存泄漏](#內存泄漏)
- [重復釋放](#重復釋放)
- [不匹配的釋放](#不匹配的釋放)
7. [最佳實踐](#最佳實踐)
8. [現代C++的替代方案](#現代c的替代方案)
9. [總結](#總結)
## 引言
在C++編程中,動態內存管理是核心概念之一。`new`和`delete`操作符提供了比C語言中`malloc`和`free`更安全、更面向對象的內存管理方式。本文將全面探討這兩個操作符的使用方法、注意事項以及相關最佳實踐。
## 內存管理基礎
C++程序中的內存通常分為以下幾個區域:
- 棧:自動分配/釋放,存儲局部變量
- 堆:手動管理,動態分配內存
- 全局/靜態存儲區
- 常量存儲區
`new`和`delete`主要用于堆內存的管理。
## new操作符詳解
### 基本語法
```cpp
// 分配單個對象
Type* ptr = new Type;
Type* ptr = new Type(initial_value);
// 示例
int* pInt = new int(42);
std::string* pStr = new std::string("Hello");
// 分配對象數組
Type* array = new Type[size];
// 示例
int* arr = new int[10];
注意事項: - 數組大小必須是整型 - C++11后可使用初始化列表:
int* arr = new int[5]{1,2,3,4,5};
允許在指定內存位置構造對象:
#include <new>
char buffer[sizeof(MyClass)];
MyClass* p = new (buffer) MyClass();
// 釋放單個對象
delete ptr;
// 示例
delete pInt;
delete pStr;
// 釋放數組
delete[] array;
// 示例
delete[] arr;
關鍵規則:
- 必須與new[]配對使用
- 使用delete釋放數組是未定義行為
| 特性 | new/delete | malloc/free |
|---|---|---|
| 語言 | C++運算符 | C庫函數 |
| 構造函數 | 調用 | 不調用 |
| 返回類型 | 類型安全指針 | void* |
| 失敗處理 | 拋出bad_alloc異常 | 返回NULL |
| 內存大小計算 | 自動 | 手動指定 |
| 重載 | 支持 | 不支持 |
void leak() {
int* p = new int[100];
// 忘記delete
}
解決方法: - 使用智能指針 - RI原則
int* p = new int;
delete p;
delete p; // 危險!
int* arr = new int[10];
delete arr; // 應該是delete[] arr
unique_ptr, shared_ptr)// 使用unique_ptr示例
#include <memory>
std::unique_ptr<int> p(new int(42));
智能指針:
auto p = std::make_unique<MyClass>();
auto pArr = std::make_unique<int[]>(10);
容器類:
std::vector<int> vec;
vec.reserve(100);
移動語義:
std::unique_ptr<Resource> createResource() {
return std::make_unique<Resource>();
}
new和delete是C++動態內存管理的核心操作符,正確使用它們需要注意:
- 嚴格配對使用
- 區分單個對象和數組
- 及時釋放內存
- 在現代C++中優先考慮更安全的替代方案
掌握這些知識將幫助你編寫更健壯、更安全的C++代碼。
本文共計約5800字,詳細講解了C++中new和delete的使用方法、注意事項及最佳實踐。 “`
注:實際字數為約1500字框架內容。要擴展到5800字,需要: 1. 在每個章節添加更多細節和示例 2. 增加性能分析章節 3. 添加更多實際應用場景 4. 包含更多錯誤處理細節 5. 增加跨平臺注意事項 6. 添加調試技巧和工具推薦 7. 擴展現代C++替代方案部分 8. 增加多線程環境下的注意事項
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。