正确使用new和delete操作符的关键在于严格配对并区分单个对象与数组的分配,1. new用于动态内存分配,delete用于释放单个对象;2. new[]用于数组分配,delete[]用于释放数组;3. 释放后应将指针置为nullptr以避免悬空指针;4. 异常安全需特别注意,现代c++++推荐使用智能指针如std::unique_ptr和std::shared_ptr来自动管理资源,从而减少内存泄露和未定义行为的风险。

正确使用
new
delete
new
delete

动态内存管理,尤其是在C++里,是个挺让人头疼的话题,因为它不像栈内存那样自动管理。你得亲力亲为,每次
new
delete
delete[]
要正确使用
new
delete
new
delete

分配单个对象:
// 分配一个 int 类型的内存,并用 10 初始化 int* p = new int(10); // 使用 p 指向的内存... // 释放 p 指向的内存 delete p; p = nullptr; // 良好的习惯,防止悬空指针
分配对象数组:

// 分配一个包含 5 个 int 的数组 int* arr = new int[5]; // 使用 arr 指向的数组... // 释放 arr 指向的数组 delete[] arr; // 注意这里是 delete[] arr = nullptr;
关键点在于:
new
delete
new[]
delete[]
delete
nullptr
new
delete
delete
new
delete
这话说起来,其实就是内存管理里的那些老生常谈,但每次看到有经验的开发者在这上面翻车,都觉得有必要再强调一下。用不好
new
delete
内存泄露:这是最常见的问题。你
new
delete
双重释放(Double Free):你对同一块内存调用了两次
delete
int* p = new int; delete p; delete p; // 错误!双重释放
悬空指针(Dangling Pointer):内存被
delete
int* p = new int(10); delete p; // 此时 p 是悬空指针 *p = 20; // 错误!访问已释放的内存
数组与非数组的混用:
new int
new int[N]
delete
delete[]
delete[]
delete
delete
new[]
delete[]
new
int* single = new int(5); delete[] single; // 错误!用 delete[] 释放单个对象 int* arr = new int[5]; delete arr; // 错误!用 delete 释放数组
这些问题,说白了都是因为我们作为程序员,需要手动管理内存的生命周期,而人总有犯错的时候。
说真的,自从C++11引入了智能指针,我对动态内存管理的看法彻底变了。以前用
new
delete
delete
RAII(Resource Acquisition Is Initialization)的核心思想是:把资源(比如内存)的生命周期和对象的生命周期绑定起来。当对象被创建时,资源被获取;当对象被销毁时(比如超出作用域),资源被自动释放。这样一来,你就不需要手动去调用
delete
C++标准库提供了几种智能指针:
std::unique_ptr
unique_ptr
unique_ptr
unique_ptr
#include <memory>
#include <iostream>
class MyObject {
public:
MyObject() { std::cout << "MyObject created\n"; }
~MyObject() { std::cout << "MyObject destroyed\n"; }
void doSomething() { std::cout << "Doing something...\n"; }
};
void processUniqueObject() {
// 使用 std::make_unique 替代 new,更安全高效
std::unique_ptr<MyObject> objPtr = std::make_unique<MyObject>();
objPtr->doSomething();
// objPtr 在这里超出作用域,MyObject 会自动被销毁
} // 析构函数自动调用,内存自动释放
void transferOwnership() {
std::unique_ptr<MyObject> p1 = std::make_unique<MyObject>();
std::unique_ptr<MyObject> p2 = std::move(p1); // 所有权从 p1 转移到 p2
// 此时 p1 变为空
if (!p1) {
std::cout << "p1 is now empty.\n";
}
p2->doSomething();
// p2 超出作用域时,MyObject 销毁
}std::unique_ptr
shared_ptr
std::shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
#include <memory>
#include <iostream>
// MyObject 和上面一样
void processSharedObject() {
std::shared_ptr<MyObject> objPtr1 = std::make_shared<MyObject>(); // 引用计数为 1
std::cout << "Count after objPtr1 creation: " << objPtr1.use_count() << "\n";
{
std::shared_ptr<MyObject> objPtr2 = objPtr1; // 引用计数为 2
std::cout << "Count after objPtr2 copy: " << objPtr1.use_count() << "\n";
objPtr2->doSomething();
} // objPtr2 超出作用域,引用计数减 1 (变为 1)
std::cout << "Count after objPtr2 out of scope: " << objPtr1.use_count() << "\n";
// objPtr1 在这里超出作用域,引用计数减 1 (变为 0),MyObject 会自动被销毁
} // 析构函数自动调用,内存自动释放std::shared_ptr
std::weak_ptr
智能指针的出现,极大简化了C++的内存管理,让程序员可以更专注于业务逻辑,而不是费心去追踪每一块内存的生命周期。它们几乎消除了手动
delete
new
delete
这个问题问得好,因为智能指针确实是主流,但
new
delete
实现自定义内存管理: 如果你在开发一个高性能的系统,需要对内存分配有极致的控制,比如实现一个内存池(memory pool)或者自定义的分配器(allocator),那么你就需要直接使用
new
delete
new
delete
operator new
operator delete
与C语言API交互: C语言没有智能指针的概念,很多C库函数会返回通过
malloc
new
delete
free
// 假设有一个 C 函数返回 malloc 分配的字符串 // char* get_c_string(); // char* s = get_c_string(); // // 使用 s // free(s); // 注意这里用 free,因为是 malloc 分配的
或者,你可能需要将
new
在某些特定容器或数据结构中: 虽然标准库容器已经非常强大,但在实现一些非常规的、对内存布局有特殊要求的数据结构时,你可能需要手动控制内存分配。比如,实现一个侵入式链表,或者一个需要紧凑内存布局的图结构。
Placement New: 这是一个比较高级的用法,允许你在已经分配好的内存上构造对象。这意味着你先用
new char[N]
malloc
placement new
#include <new> // 包含 placement new
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructed.\n"; }
~MyClass() { std::cout << "MyClass destructed.\n"; }
};
char buffer[sizeof(MyClass)]; // 预先分配一块内存
int main() {
MyClass* obj = new (buffer) MyClass(); // 在 buffer 上构造 MyClass 对象
// 使用 obj...
obj->~MyClass(); // 手动调用析构函数
// 不需要 delete buffer,因为 buffer 是栈上的数组
return 0;
}这里需要注意的是,
placement new
delete
总的来说,在现代C++日常开发中,我们应该优先使用智能指针(
std::unique_ptr
std::shared_ptr
std::make_unique
std::make_shared
new
delete
以上就是如何正确使用new和delete操作符 动态内存分配与释放的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号