在C++中,智能指针是管理动态分配内存的工具,它们自动处理内存的分配和释放,帮助避免内存泄漏。C++标准库提供了几种智能指针,包括
std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。下面是这些智能指针的基本使用方法:
std::unique_ptr
std::unique_ptr
拥有独占所有权的指针,同一时间内只能有一个unique_ptr
指向某个资源。当unique_ptr
离开作用域时,它所指向的资源会被自动删除。
#include <memory>
int main() {
std::unique_ptr<int> ptr(new int(42)); // 创建unique_ptr并初始化
// 使用智能指针
std::cout << *ptr << std::endl; // 输出42
// 不需要手动删除,智能指针会自动管理内存
} // 当ptr离开作用域时,它所指向的内存会被自动释放
std::shared_ptr
std::shared_ptr
允许多个智能指针共享同一个资源的所有权。资源会在最后一个指向它的shared_ptr
销毁时被释放。
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> ptr1(new int(42)); // 创建shared_ptr并初始化
std::shared_ptr<int> ptr2(ptr1); // ptr2共享ptr1的资源
std::cout << *ptr1 << " " << *ptr2 << std::endl; // 输出42 42
// 当ptr1和ptr2离开作用域时,资源只在最后一个shared_ptr被销毁时释放
} // 如果这里只有ptr1离开了作用域,资源依然不会被释放,直到ptr2也离开作用域
std::weak_ptr
std::weak_ptr
是一种不增加它所指向的对象的引用计数的智能指针,通常与shared_ptr
一起使用,用来避免循环引用的问题,并检测资源是否已经被释放。
#include <memory>
#include <iostream>
#include <boost/optional.hpp> // 或者C++17中的std::optional
int main() {
std::shared_ptr<int> shared(new int(42));
std::weak_ptr<int> weak(shared);
if(auto locked = weak.lock()) { // lock()尝试获取一个shared_ptr
std::cout << *locked << std::endl; // 输出42,如果资源存在的话
} else {
std::cout << "Resource has been released." << std::endl;
}
// weak_ptr不会延长资源的生命周期
} // 资源在shared_ptr离开作用域时被释放,weak_ptr检测到资源已被释放