智能指针是C++中的一种特性,它自动管理动态分配的内存,以防止内存泄漏。智能指针通过封装原始指针并提供适当的析构函数来自动释放内存。当智能指针离开其作用域或被删除时,它所指向的内存也会被自动释放。
C++标准库提供了三种类型的智能指针:std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。
- std::unique_ptr
std::unique_ptr
是一个独占所有权的智能指针,意味着同一时间只能有一个 unique_ptr
指向某个对象。当 unique_ptr
被销毁时(例如,超出作用域),它所指向的对象也会被删除。
例子:
cpp复制代码
#include <iostream> | |
#include <memory> | |
class MyClass { | |
public: | |
MyClass(int value) : value_(value) {} | |
void printValue() const { std::cout << "Value: " << value_ << std::endl; } | |
private: | |
int value_; | |
}; | |
int main() { | |
std::unique_ptr<MyClass> ptr(new MyClass(42)); | |
ptr->printValue(); // 输出 "Value: 42" | |
// 当ptr离开作用域时,它所指向的MyClass对象会被自动删除 | |
return 0; | |
} |
- std::shared_ptr
std::shared_ptr
是一个共享所有权的智能指针,它允许多个 shared_ptr
实例指向同一个对象。每个 shared_ptr
维护一个引用计数,当最后一个引用该对象的 shared_ptr
被销毁或重置时,对象才会被删除。
例子:
cpp复制代码
#include <iostream> | |
#include <memory> | |
class MyClass { | |
public: | |
MyClass(int value) : value_(value) {} | |
void printValue() const { std::cout << "Value: " << value_ << std::endl; } | |
private: | |
int value_; | |
}; | |
int main() { | |
std::shared_ptr<MyClass> ptr1(new MyClass(42)); | |
std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2现在与ptr1共享所有权 | |
ptr2->printValue(); // 输出 "Value: 42" | |
// 当ptr1和ptr2都离开作用域时,它们所指向的MyClass对象才会被删除 | |
return 0; | |
} |
- std::weak_ptr
std::weak_ptr
是一种不控制所指向对象生存期的智能指针,它指向一个由 std::shared_ptr
管理的对象。它的主要目的是为了避免 std::shared_ptr
的循环引用问题。当最后一个 std::shared_ptr
离开作用域或被重置,且没有 std::weak_ptr
指向该对象时,对象才会被删除。
例子:
cpp复制代码
// 通常与std::shared_ptr一起使用来避免循环引用,这里仅展示weak_ptr的基本用法 | |
std::shared_ptr<MyClass> shared = std::make_shared<MyClass>(42); | |
std::weak_ptr<MyClass> weak = shared; | |
if (auto strong = weak.lock()) { | |
strong->printValue(); // 输出 "Value: 42",如果shared_ptr仍然有效 | |
} |
智能指针是C++中内存管理的重要工具,它们通过自动处理内存释放来减少内存泄漏的风险,并使得代码更加安全和易于维护。