cplusplus智能指针
时间: 2023-10-02 17:13:04 浏览: 43
智能指针是 C++ 中的一种特殊类型,用于管理动态分配的内存。它可以自动释放内存,避免了手动管理内存的繁琐和可能的内存泄漏。C++ 提供了三种智能指针:unique_ptr、shared_ptr 和 weak_ptr。
1. unique_ptr:
unique_ptr 是一种独占所有权的智能指针,它不能被复制或共享。当 unique_ptr 被销毁时,它所管理的对象也会自动被释放。
示例代码:
```cpp
#include <memory>
int main() {
std::unique_ptr<int> myPtr(new int(10));
// 使用 myPtr 操作动态分配的内存
// 当 myPtr 超出作用域时,内存会自动释放
return 0;
}
```
2. shared_ptr:
shared_ptr 是一种带有引用计数的智能指针,多个 shared_ptr 可以共享同一个对象。当没有任何 shared_ptr 指向它时,对象会被销毁。
示例代码:
```cpp
#include <memory>
int main() {
std::shared_ptr<int> ptr1(new int(10));
{
std::shared_ptr<int> ptr2 = ptr1; // 引用计数加1
// 使用 ptr1 和 ptr2 操作动态分配的内存
} // ptr2 超出作用域,引用计数减1
// 当 ptr1 超出作用域时,内存会自动释放
return 0;
}
```
3. weak_ptr:
weak_ptr 是一种弱引用智能指针,它可以指向 shared_ptr 所管理的对象,但不会改变引用计数。当所有 shared_ptr 都释放后,weak_ptr 会自动失效。
示例代码:
```cpp
#include <memory>
int main() {
std::shared_ptr<int> ptr1(new int(10));
std::weak_ptr<int> ptr2 = ptr1; // 弱引用
{
std::shared_ptr<int> ptr3 = ptr2.lock(); // 通过 weak_ptr 获取强引用
if (ptr3) {
// 使用 ptr3 操作动态分配的内存
}
} // ptr3 超出作用域,引用计数减1
// 当 ptr1 超出作用域时,内存会自动释放
return 0;
}
```
问题产生的原因:在 C 语言中,动态分配内存需要使用 malloc 和 free 函数进行手动管理。手动管理内存可能会出现遗漏释放、重复释放或内存泄漏等问题。智能指针的出现可以帮助开发者自动管理内存,提高代码的可靠性和安全性。