本文简单介绍一下C++中的三大智能指针和它们各自的用法。
目录
前言
C++智能指针(Smart Pointers)是C++11引入的一种用于自动管理动态内存的工具。智能指针通过RAII(Resource Acquisition Is Initialization)机制,在对象生命周期结束时自动释放内存,避免了内存泄漏和悬空指针等问题。C++标准库提供了三种主要的智能指针:std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。
正文
1. std::unique_ptr
std::unique_ptr
是独占所有权的智能指针,确保同一时间只有一个指针可以拥有某个对象。
特点:
- 独占所有权,不允许复制。
- 可以转移所有权(使用
std::move
)。
示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass Constructor\n";
}
~MyClass() {
std::cout << "MyClass Destructor\n";
}
void display() {
std::cout << "MyClass display\n";
}
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
ptr1->display();
// 转移所有权
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
if (!ptr1) {
std::cout << "ptr1 is null\n";
}
ptr2->display();
// 自动释放内存
return 0;
}
2. std::shared_ptr
std::shared_ptr
是共享所有权的智能指针,多个指针可以共享同一个对象,使用引用计数来管理对象的生命周期。
特点:
- 共享所有权,多个指针可以指向同一个对象。
- 使用引用计数,当最后一个指针销毁时,自动释放对象。
示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass Constructor\n";
}
~MyClass() {
std::cout << "MyClass Destructor\n";
}
void display() {
std::cout << "MyClass display\n";
}
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
ptr1->display();
// 转移所有权
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
if (!ptr1) {
std::cout << "ptr1 is null\n";
}
ptr2->display();
// 自动释放内存
return 0;
}
3. std::weak_ptr
std::weak_ptr
是弱引用智能指针,不会影响对象的引用计数,通常与std::shared_ptr
配合使用,解决循环引用问题。
特点:
- 不共享所有权,不影响引用计数。
- 可以检查对象是否已经被销毁。
示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass Constructor\n";
}
~MyClass() {
std::cout << "MyClass Destructor\n";
}
void display() {
std::cout << "MyClass display\n";
}
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
std::weak_ptr<MyClass> weakPtr = ptr1;
if (auto sharedPtr = weakPtr.lock()) {
sharedPtr->display();
std::cout << "ptr1 use count: " << ptr1.use_count() << "\n"; // 输出: 2
}
// 自动释放内存
return 0;
}
总结
智能指针在C++中提供了一种安全、简洁的内存管理方式,避免了手动管理动态内存带来的复杂性和潜在错误。选择合适的智能指针类型可以根据具体需求来决定:
- 使用
std::unique_ptr
来确保独占所有权。 - 使用
std::shared_ptr
来共享所有权。 - 使用
std::weak_ptr
来解决循环引用问题。