当前位置:   article > 正文

C++ 中智能指针的用法_c++智能指针用法

c++智能指针用法

在 C++ 中,智能指针是一种封装了动态分配内存的指针类,它们能够自动处理分配和释放内存的操作,从而避免出现内存泄漏的问题。C++ 中的智能指针有三种:std::unique_ptrstd::shared_ptrstd::weak_ptrauto_ptr 在 C++11 中被摈弃)。它们的具体用法如下:

  • std::unique_ptr

std::unique_ptr 能自动释放动态分配的对象,以达到避免内存泄漏的目的。该类的特点是:只有一个 std::unique_ptr 类型的指针可以指向其封装的指针对象,这就意味着一个 std::unique_ptr 类型的指针不能被复制,但可以被移动(即所有权可以转移)。以下是一个示例:

std::unique_ptr<int> ptr(new int(3)); // 声明一个 std::unique_ptr,将其初始化为指向堆上分配的 int 类型对象
std::cout << *ptr << std::endl; // 输出 3
  • std::shared_ptr

std::shared_ptr 是一个可共享的指针类,它可以使多个指针指向同一个指针对象,以达到共享资源的目的。同时,该类也能自动处理动态分配对象的内存释放,以避免内存泄漏。以下是一个示例:

std::shared_ptr<int> ptr1(new int(4)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
std::shared_ptr<int> ptr2 = ptr1; // 通过构造函数将 ptr2 初始化为 ptr1 的副本,此时 ptr1 和 ptr2 指向同一个对象,其计数器为 2
std::cout << *ptr1 << "," << *ptr2 << std::endl; // 输出 4,4

// 当超出 ptr1 和 ptr2 的作用域时,其引用计数会减少 1,当计数为 0 时,自动释放堆内存
  • std::weak_ptr

std::weak_ptr 允许您在不影响引用计数的情况下,以非剥夺方式获得与 std::shared_ptr 具有相同目的的对象引用。可以使用 std::weak_ptr 防止引用计数循环引用。以下是一个示例:

std::weak_ptr<int> wp;
{ // 内嵌作用域
    std::shared_ptr<int> sp(new int(5)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
    wp = sp; // 使用 std::weak_ptr 初始化一个分离的引用,此时 sp 和 wp 指向同一个对象,其计数器为 1
    std::cout << "wp: " << *wp.lock() << std::endl; // 输出 wp 所指向的对象的值,即 5,使用 weak_ptr::lock 获得 shared_ptr,调用 shared_ptr 的操作符 * 访问值
} // sp 离开作用域,并自动释放堆内存
std::cout << "wp: " << (wp.expired() ? "expired" : "alive") << std::endl; // 输出 wp 是否引用了已释放的堆内存

在使用智能指针时,通常可以使用 std::make_uniquestd::make_shared 来分配动态内存。例如:

std::unique_ptr<Foo> fooPtr = std::make_unique<Foo>();
std::shared_ptr<Foo> fooSharedPtr = std::make_shared<Foo>();

make_unique 的具体用法
以上便简单介绍了 C++ 中智能指针的用法。需要注意的是,智能指针不是万能的,它们只是一种编写更安全和简单代码的方法,而不是一个解决所有内存管理问题的魔法解决方案。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/1021448
推荐阅读
相关标签
  

闽ICP备14008679号