7、基础 | C++的内存管理二
1. new 和 delete
在C++中,内存管理是一个核心且复杂的主题,它涉及到动态内存分配和释放。new
和delete
操作符是C++中用于管理动态内存的主要工具。
1.1 new
new
操作符用于在堆上动态分配内存,并调用对象的构造函数(如果有的话)。new
可以返回指向分配的内存的指针,该指针可以用来访问和操作对象。
例子
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(int x) : value(x) {}
void display() const {
cout << "Value: " << value << endl;
}
private:
int value;
};
int main() {
// 使用new动态分配MyClass对象
MyClass* myObject = new MyClass(10);
// 使用对象
myObject->display(); // 输出: Value: 10
// ...(后续对myObject的操作)
// 不要忘记释放内存
delete myObject;
return 0;
}
在这个例子中,new
操作符被用来在堆上分配一个MyClass
类型的对象,并调用其构造函数,传递参数10。分配的内存地址被存储在指针myObject
中,然后通过该指针访问对象的display
方法。
1.2 delete
delete
操作符用于释放之前通过new
操作符分配的内存。当使用delete
时,对象的析构函数(如果有的话)会被调用,以执行必要的清理工作。
例子(继续上面的代码)
// ...(前面的代码)
// 释放内存
delete myObject;
// 注意:释放内存后,myObject成为悬垂指针(dangling pointer),
// 它不再指向有效的内存地址。为了安全起见,可以将它设置为nullptr。
myObject = nullptr;
// 尝试访问已删除的对象会导致未定义行为
// myObject->display(); // 不要这样做!
return 0;
在这个例子中,delete
操作符被用来释放myObject
指针所指向的内存。在释放内存后,将myObject
设置为nullptr
是一个好习惯,这可以防止悬垂指针的问题。
注意事项
- 匹配new和delete:对于每个
new
表达式,都应该有一个对应的delete
表达式。同样,对于new[]
(用于分配对象数组),应该使用delete[]
来释放内存。 - 避免内存泄漏:确保所有通过
new
分配的内存最终都被delete
释放。内存泄漏是程序长期运行后性能下降的常见原因之一。 - 避免重复释放:不要对同一个指针使用多次
delete
。这会导致未定义行为,通常表现为程序崩溃。 - 智能指针:C++11及更高版本引入了智能指针(如
std::unique_ptr
和std::shared_ptr
),它们可以自动管理内存,减少内存泄漏的风险。
通过合理使用new
和delete
(或智能指针),C++程序员可以精确控制程序的内存使用,编写出高效、可维护的代码。
2. 智能指针
在C++中,智能指针是管理动态内存的一种重要方式,它们能够自动释放所管理的资源,从而避免内存泄漏等问题。以下是关于智能指针的详细整理,包括通用操作、shared_ptr、unique_ptr和weak_ptr,并附有具体例子。
2.1 智能指针的通用操作
智能指针的行为类似于常规指针,但它们提供了自动资源管理的功能。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【C/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。