智能指针简介
  XxAHIGK5wVKO 2023年11月02日 20 0


智能指针简介_weak_ptr

智能指针简介


文章目录

  • 智能指针简介
  • 摘要
  • 什么是智能指针
  • C++ 98 中的智能指针
  • C++ 11 中的智能指针
  • C++ 17 中的智能指针
  • 智能指针常用函数



关键字:

智能指针

auto_ptr

std::shared_ptr

std::unique_ptr

std::weak_ptr

摘要

之前基本都是学习的Qt版本的C++,更多的关注了Qt的语法,而忽略了C++的语法。而且之前的项目基本都是自己一个开发,程序的功能实现都是使用自己熟悉的方式,最近的项目都是多人合作开发,有部分代码是纯C++版本,因为需要掌握和理解代码,所以需要重新学一下C++的语法。要想学好C++,智能指针是一个要不过去的坎,这几篇先研究下C++中的智能指针。

什么是智能指针

智能指针(Smart Pointer)是一种用于管理动态分配的对象的C++类模板。它们提供了自动化的内存管理,可以帮助避免内存泄漏和悬挂指针等常见的错误。

智能指针的主要目标是在对象不再需要时自动释放相关的内存。它们通过在对象上使用引用计数、所有权转移或其他技术来实现这一目标。

在C++中,有几种常见的智能指针类,包括:

  1. std::shared_ptr:实现了共享所有权的智能指针。它可以被多个指针共享,当最后一个指针离开作用域时,关联的资源会被释放。
  2. std::unique_ptr:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。
  3. std::weak_ptr:用于解决std::shared_ptr的循环引用问题。它可以观测一个对象,但不会增加引用计数,也不会阻止对象的销毁。

这些智能指针类提供了更安全和更方便的内存管理方式,可以减少手动管理内存的工作量,并帮助避免内存泄漏和悬挂指针等问题。它们是现代C++中常用的工具之一,推荐在合适的情况下使用。

C++ 98 中的智能指针

在C++98中,有一个名为auto_ptr的智能指针类可用。auto_ptr是C++98标准库中提供的一种简单的智能指针,用于管理动态分配的对象。
auto_ptr的特点是在拷贝时转移所有权,即拷贝后原始指针会被置空,只有一个指针可以拥有资源。这种行为可能导致潜在的问题,因此在C++11中被废弃,并在C++17中被移除。
以下是一个简单的示例,演示了如何使用auto_ptr:
#include <iostream>
#include <memory>

int main() {
 std::auto_ptr<int> p1(new int(5));
 std::auto_ptr<int> p2;

 p2 = p1;  // 所有权转移

 std::cout << *p2 << std::endl;  // 输出 5

 return 0;
}
请注意,auto_ptr在拷贝时会转移所有权,因此在上述示例中,p1在赋值给p2后变为空指针。这意味着你不能再使用p1来访问资源。
由于auto_ptr的行为可能导致潜在的问题,建议在C++11及更高版本中使用更安全和更强大的智能指针类,如std::shared_ptr和std::unique_ptr。这些类提供更好的语义和资源管理功能。

C++ 11 中的智能指针

在C++11中,引入了更强大和更安全的智能指针类,包括std::shared_ptrstd::unique_ptrstd::weak_ptr。这些智能指针类提供了更好的语义和资源管理功能,取代了C++98中的auto_ptr

以下是C++11中的智能指针类的简要介绍:

  1. std::shared_ptr:实现了共享所有权的智能指针。它可以被多个指针共享,通过引用计数来跟踪资源的生命周期。只有当最后一个std::shared_ptr离开作用域时,关联的资源才会被释放。
  2. std::unique_ptr:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。当std::unique_ptr离开作用域时,关联的资源会被自动释放。
  3. std::weak_ptr:用于解决std::shared_ptr的循环引用问题。std::weak_ptr可以观测一个对象,但不会增加引用计数,也不会阻止对象的销毁。可以通过std::weak_ptr来获取std::shared_ptr,并在需要时检查对象是否仍然存在。

这些智能指针类提供了更好的内存管理和资源安全性,可以减少内存泄漏和悬挂指针等问题的发生。它们是现代C++中推荐使用的工具,可以大大简化代码并提高程序的可靠性。

C++ 17 中的智能指针

在C++17中,除了C++11中引入的std::shared_ptrstd::unique_ptrstd::weak_ptr之外,还引入了两个新的智能指针类:std::shared_mutexstd::scoped_lock

  1. std::shared_mutex:这是一个用于实现共享互斥锁的类。它提供了读写锁的功能,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这对于需要高效地支持并发读取和独占写入的场景非常有用。
  2. std::scoped_lock:这是一个用于管理多个互斥锁的类。它可以一次性锁定多个互斥锁,避免了手动管理多个锁的复杂性和潜在的死锁问题。std::scoped_lock使用了RAII(资源获取即初始化)的原则,确保在作用域结束时自动释放锁。

这些智能指针类的引入进一步增强了C++的内存管理和并发编程能力。它们提供了更高级别的抽象和更安全的资源管理,可以简化代码并提高程序的可靠性和性能。在C++17及更高版本中,推荐使用这些智能指针类来管理资源和处理并发操作。

智能指针常用函数

C++智能指针类(如std::shared_ptrstd::unique_ptrstd::weak_ptr)提供了一系列常用的成员函数来管理和操作指针。以下是一些常用的函数:

  1. get():返回指向托管对象的原始指针。
  2. reset():释放当前指针所管理的对象,并将指针重置为空。
  3. operator*():解引用指针,返回托管对象的引用。
  4. operator->():通过指针访问托管对象的成员。
  5. use_count()(仅适用于std::shared_ptr):返回与当前std::shared_ptr共享对象的指针数量。
  6. unique()(仅适用于std::shared_ptr):检查当前std::shared_ptr是否是唯一拥有对象的指针。
  7. expired()(仅适用于std::weak_ptr):检查与当前std::weak_ptr关联的对象是否已经被销毁。
  8. lock()(仅适用于std::weak_ptr):尝试获取与当前std::weak_ptr关联的std::shared_ptr,如果对象仍然存在,则返回有效的std::shared_ptr,否则返回空的std::shared_ptr

这些函数使得智能指针的使用更加方便和安全。你可以根据具体的需求选择适当的智能指针类,并使用相应的成员函数来管理和操作指针。


智能指针简介_unique_ptr_02


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

XxAHIGK5wVKO