C++精品小案例解析之:智能指针的分类

智能指针是C++中的一种特性,它自动管理动态分配的内存,以防止内存泄漏。智能指针通过封装原始指针并提供适当的析构函数来自动释放内存。当智能指针离开其作用域或被删除时,它所指向的内存也会被自动释放。

C++标准库提供了三种类型的智能指针:std::unique_ptrstd::shared_ptr 和 std::weak_ptr

  1. 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;
}
  1. 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;
}
  1. 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++中内存管理的重要工具,它们通过自动处理内存释放来减少内存泄漏的风险,并使得代码更加安全和易于维护。

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值