c++ #include <memory> 智能指针介绍
#include <memory>
是 C++ 标准库中的头文件,用于支持智能指针的功能。智能指针是现代 C++ 的一种资源管理工具,用于自动管理动态分配的内存,从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针,包括 std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。
1. #include <memory>
#include
:预处理指令,用于在编译时包含指定的头文件。<memory>
:包含智能指针类的定义和相关功能。
2. 智能指针类型
-
std::unique_ptr
:- 功能:表示对某个动态分配对象的唯一所有权。它不能被复制,只能被移动。
- 使用场景:用于独占资源的场景,例如需要确保只有一个对象拥有资源。
- 示例:
#include <memory>
int main() {
std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
// std::unique_ptr<int> ptr2 = ptr1; // 错误:unique_ptr 不能被复制
std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移所有权
return 0;
}
std::shared_ptr
:
- 功能:表示对某个动态分配对象的共享所有权。多个
shared_ptr
可以指向同一个对象,直到最后一个shared_ptr
被销毁时,资源才会被释放。 - 使用场景:用于多个对象需要共享对同一资源的所有权的场景。
- 示例:
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
std::shared_ptr<int> ptr2 = ptr1; // 共享所有权
std::cout << *ptr1 << ", " << *ptr2 << std::endl; // 输出:20, 20
return 0;
}
std::weak_ptr
:
- 功能:与
std::shared_ptr
配合使用,用于解决共享所有权中的循环引用问题。weak_ptr
不会影响对象的引用计数,因此不会阻止对象的销毁。 - 使用场景:用于观察对象而不影响其生命周期。
- 示例
#include <memory>
#include <iostream>
class Node {
public:
std::shared_ptr<Node> next;
};
int main() {
std::shared_ptr<Node> first = std::make_shared<Node>();
std::weak_ptr<Node> weakFirst = first; // 创建 weak_ptr 观察 first
if (auto sharedFirst = weakFirst.lock()) {
std::cout << "Node is still alive" << std::endl;
} else {
std::cout << "Node has been destroyed" << std::endl;
}
return 0;
}
3.使用示例
#include <iostream>
#include <memory>
int main() {
// 使用 unique_ptr
std::unique_ptr<int> uniquePtr = std::make_unique<int>(100);
std::cout << "UniquePtr value: " << *uniquePtr << std::endl;
// 使用 shared_ptr
std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(200);
std::shared_ptr<int> sharedPtr2 = sharedPtr1;
std::cout << "SharedPtr value: " << *sharedPtr1 << ", " << *sharedPtr2 << std::endl;
// 使用 weak_ptr
std::weak_ptr<int> weakPtr = sharedPtr1;
if (auto lockedPtr = weakPtr.lock()) {
std::cout << "WeakPtr value: " << *lockedPtr << std::endl;
} else {
std::cout << "WeakPtr is expired" << std::endl;
}
return 0;
}
4. 优点
- 自动管理内存:智能指针自动管理动态内存,减少了内存泄漏和手动释放内存的需要。
- 安全性:智能指针避免了许多常见的内存管理错误,如悬挂指针和双重释放。
- 简洁性:提供了高效、易用的内存管理接口,使得代码更易于编写和维护。
使用 #include <memory>
可以有效地帮助管理动态内存,提升 C++ 程序的安全性和稳定性。