智能指针简介
文章目录
- 智能指针简介
- 摘要
- 什么是智能指针
- 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++中,有几种常见的智能指针类,包括:
std::shared_ptr
:实现了共享所有权的智能指针。它可以被多个指针共享,当最后一个指针离开作用域时,关联的资源会被释放。std::unique_ptr
:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。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_ptr
、std::unique_ptr
和std::weak_ptr
。这些智能指针类提供了更好的语义和资源管理功能,取代了C++98中的auto_ptr
。以下是C++11中的智能指针类的简要介绍:
std::shared_ptr
:实现了共享所有权的智能指针。它可以被多个指针共享,通过引用计数来跟踪资源的生命周期。只有当最后一个std::shared_ptr
离开作用域时,关联的资源才会被释放。std::unique_ptr
:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。当std::unique_ptr
离开作用域时,关联的资源会被自动释放。std::weak_ptr
:用于解决std::shared_ptr
的循环引用问题。std::weak_ptr
可以观测一个对象,但不会增加引用计数,也不会阻止对象的销毁。可以通过std::weak_ptr
来获取std::shared_ptr
,并在需要时检查对象是否仍然存在。这些智能指针类提供了更好的内存管理和资源安全性,可以减少内存泄漏和悬挂指针等问题的发生。它们是现代C++中推荐使用的工具,可以大大简化代码并提高程序的可靠性。
C++ 17 中的智能指针
在C++17中,除了C++11中引入的
std::shared_ptr
、std::unique_ptr
和std::weak_ptr
之外,还引入了两个新的智能指针类:std::shared_mutex
和std::scoped_lock
。
std::shared_mutex
:这是一个用于实现共享互斥锁的类。它提供了读写锁的功能,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这对于需要高效地支持并发读取和独占写入的场景非常有用。std::scoped_lock
:这是一个用于管理多个互斥锁的类。它可以一次性锁定多个互斥锁,避免了手动管理多个锁的复杂性和潜在的死锁问题。std::scoped_lock
使用了RAII(资源获取即初始化)的原则,确保在作用域结束时自动释放锁。这些智能指针类的引入进一步增强了C++的内存管理和并发编程能力。它们提供了更高级别的抽象和更安全的资源管理,可以简化代码并提高程序的可靠性和性能。在C++17及更高版本中,推荐使用这些智能指针类来管理资源和处理并发操作。
智能指针常用函数
C++智能指针类(如
std::shared_ptr
、std::unique_ptr
和std::weak_ptr
)提供了一系列常用的成员函数来管理和操作指针。以下是一些常用的函数:
get()
:返回指向托管对象的原始指针。reset()
:释放当前指针所管理的对象,并将指针重置为空。operator*()
:解引用指针,返回托管对象的引用。operator->()
:通过指针访问托管对象的成员。use_count()
(仅适用于std::shared_ptr
):返回与当前std::shared_ptr
共享对象的指针数量。unique()
(仅适用于std::shared_ptr
):检查当前std::shared_ptr
是否是唯一拥有对象的指针。expired()
(仅适用于std::weak_ptr
):检查与当前std::weak_ptr
关联的对象是否已经被销毁。lock()
(仅适用于std::weak_ptr
):尝试获取与当前std::weak_ptr
关联的std::shared_ptr
,如果对象仍然存在,则返回有效的std::shared_ptr
,否则返回空的std::shared_ptr
。这些函数使得智能指针的使用更加方便和安全。你可以根据具体的需求选择适当的智能指针类,并使用相应的成员函数来管理和操作指针。