学习目标:
学习内容:
动态内存管理基础:
new
操作符可以在堆上分配内存,它返回指向新分配类型的指针。使用delete
操作符释放由new
分配的内存。int* ptr = new int; // 分配单个整数
*ptr = 5; // 给分配的整数赋值
delete ptr; // 释放内存
ptr = nullptr; // 将ptr设置为nullptr,防止悬空指针
new
和delete
。int* array = new int[10]; // 分配10个整数的数组
delete[] array; // 释放整个数组
delete
。智能指针简介:
<memory>
头文件中。std::unique_ptr
:
std::unique_ptr
提供了独占的内存所有权模型。一旦std::unique_ptr
对象被销毁,它所指向的对象也会被自动销毁。std::unique_ptr
不支持拷贝和赋值,确保同一时间只有一个unique_ptr
指向特定资源。std::make_unique
函数创建std::unique_ptr
实例。std::unique_ptr<int> uptr = std::make_unique<int>(10); // 使用make_unique
std::shared_ptr
:
std::shared_ptr
使用引用计数机制来确保多个指针可以共享同一资源的所有权。shared_ptr
被销毁时,资源会被自动释放。std::make_shared
函数创建std::shared_ptr
实例。std::shared_ptr<int> sptr = std::make_shared<int>(20); // 使用make_shared
std::weak_ptr
:
std::weak_ptr
设计用来解决std::shared_ptr
可能导致的循环引用问题。std::weak_ptr
不控制对象的生命周期,在需要时通过调用lock
方法尝试获取std::shared_ptr
来访问资源。std::weak_ptr<int> wptr = sptr; // sptr是一个shared_ptr
if (std::shared_ptr<int> sptr_locked = wptr.lock()) {
// 使用sptr_locked访问资源
} else {
// 资源已经被释放
}
练习题:
编写一个程序,创建一个std::shared_ptr
管理的int数组。使用std::shared_ptr
和std::weak_ptr
演示资源共享和弱引用的概念。
#include <iostream>
#include <memory>
int main() {
// 创建一个shared_ptr管理的int数组
std::shared_ptr<int[]> sptr(new int[3]{1, 2, 3}, std::default_delete<int[]>());
// 创建一个weak_ptr指向同一个数组
std::weak_ptr<int[]> wptr(sptr);
// 使用lock()尝试获取一个shared_ptr
if (auto shared = wptr.lock()) {
for (int i = 0; i < 3; ++i) {
std::cout << shared[i] << ' ';
}
std::cout << '\n';
} else {
std::cout << "资源已释放。\n";
}
// shared_ptr离开作用域,数组被自动释放
return 0;
}
// 预计输出效果
// 1 2 3
答案解析:
本练习中,我们首先创建了一个由std::shared_ptr
管理的整数数组。然后,我们创建了一个std::weak_ptr
,指向相同的数组。通过lock
方法尝试获取std::shared_ptr
,如果资源仍然存在,我们输出数组的内容。当最后一个std::shared_ptr
被销毁时,数组资源也会被自动释放。