C++ 智能指针31 2025 年 7 月 | 阅读 8 分钟 在 C++ 编程语言中,智能指针是标准库(<memory>)中提供的类模板,它们可以自动管理动态分配的内存。它们充当原始指针的包装器,但具有内置的内存管理功能。这些指针主要用作模板,因此我们可以为任何类型的内存创建智能指针。 智能指针有助于防止 C++ 编程中的一些常见内存问题。其中一些问题如下:
智能指针遵循 RAII(资源获取初始化)原则,这意味着内存会被自动获取和释放。我们将实现智能指针,使其能够释放未使用的资源内存。 C++ 中的智能指针示例让我们通过一个示例来说明 C++ 中的智能指针。 示例编译并运行输出 100 说明 在此示例中,我们演示了一个自定义 SmartPtr 类的智能指针。它管理一个动态分配的整数,并在其析构函数中自动释放内存,从而防止内存泄漏。之后,重载的 * 运算符允许像普通指针一样访问被指向的值。 使用模板类的 C++ 智能指针示例 上面的示例仅适用于 int。现在,我们将创建一个适用于所有 数据类型 的模板。让我们通过另一个示例来说明 C++ 中使用模板类的智能指针。 示例编译并运行输出 100 说明 在此示例中,我们使用 C++ 模板定义了一个通用的智能指针类 SmartPtr,它允许它管理任何类型的动态分配的对象。之后,它会在析构函数中自动删除资源,这有助于防止内存泄漏。重载的 * 和 -> 运算符使得指针般的行为能够访问和修改对象。 智能指针的类型C++ 中有几种智能指针。其中一些如下: ![]() Unique_ptrunique_ptr 是一种智能指针,可确保在任何给定时间只有一个 unique_ptr 可以拥有特定资源,从而防止内存泄漏和不可预测的行为。它表示关联的资源会在 unique_ptr 退出其作用域时自动释放,或通过 move() 方法手动移除。 语法 它具有以下语法: C++ 中 unique_ptr 的特性 C++ 中 unique_ptr 的一些特性如下:
Unique_ptr C++ 示例 让我们通过一个示例来说明 C++ 中的 Unique_ptr 示例。 示例编译并运行输出 100 100 说明 在此示例中,我们演示了 unique_ptr 如何管理 Rectangle 对象的动态内存。指针的所有权通过 move() 函数从 P1 转移到 P2,从而确保一次只有一个唯一指针拥有该对象。之后,使用箭头运算符访问面积。 Shared_ptr在 shared_ptr 中,我们可以在同一时间将多个对象指向单个指针。使用 use_count() 方法维护一个引用计数来表示对象。 语法 它具有以下语法: C++ 中 shared_ptr() 函数的特性 C++ 中 shared_ptr() 函数的一些特性如下:
Shared_ptr C++ 示例 让我们通过一个示例来说明 C++ 中的 shared_ptr。 示例编译并运行输出 100 100 100 2 说明 在此示例中,我们演示了 C++ 中的 shared_ptr。首先,我们有两个智能指针(P1 和 P2),它们共享 Rectangle 对象的拥有权。之后,两个指针都可以访问 area() 方法和 use_count() 方法,该方法显示有多少指针正在管理该对象。 Weak_ptrweak_ptr 与 shared_ptr 类似。weak 和 shared_ptr 的主要区别在于它不维护引用计数,并且对象对指针没有强引用。此属性可能导致死锁,因为不同的对象将尝试持有指针。 语法 它具有以下语法: C++ 中 weak_ptr 的特性 C++ 中 weak_ptr 的一些特性如下:
Weak_ptr C++ 示例 让我们通过一个示例来说明 C++ 中的 weak_ptr。 示例编译并运行输出 Parent use count: 1 Child use count: 1 Child destroyed Parent destroyed End of scope reached. 说明 在此示例中,我们演示了 weak_ptr 来避免循环引用。在这里,Parent 类持有 Child 类的 shared_ptr,而 Child 类持有 Parent 类的 weak_ptr。它确保当两个类都超出作用域时,它们的析构函数都会被正确调用,从而防止由循环 shared_ptr 依赖关系引起的内存泄漏。 C++ 中原始指针和智能指针的区别C++ 中原始指针和智能指针的一些区别如下:
结论总之,C++ 智能指针通过处理资源分配来自动简化内存管理。它们有助于消除内存泄漏、悬空指针和手动删除调用等问题。std::unique_ptr、std::shared_ptr 和 std::weak_ptr 等智能指针各自服务于不同的所有权需求。 智能指针选择题1) 如果我们尝试在 C++ 中复制 std::unique_ptr,会发生什么?
答案: c) 发生编译时错误 2) 与 C++ 中的原始指针相比,使用智能指针的主要优点是什么?
答案: b) 它们有助于防止内存泄漏 3) 为什么 std::unique_ptr 在 C++ 中被优先用于资源的单一所有权?
答案: a) 它确保了特殊所有权和自动删除 4) std::shared_ptr 在 C++ 中如何管理资源的生命周期?
答案: c) 当最后一个 shared_ptr 被销毁时,它会删除资源 5) 当 unique_ptr 被移动到另一个 unique_ptr 时会发生什么?
答案: d) 所有权已转移;原始指针变为 null 下一主题C++ 中的多态类型 |
树在计算机科学和数据结构领域对于有效组织和管理数据至关重要。在现实世界的应用中,树是用于描述各种连接和层次结构的层次结构。它们是计算机科学的基石,因为它们...
11 分钟阅读
C++ 中的埃拉托斯特尼筛法旨在识别给定范围内或 up to 指定限制 'n' 的所有素数。它以古希腊数学家埃拉托斯特尼的名字命名。该算法提供了一种系统的方法来筛选非素数,使其成为宝贵的工具...
11 分钟阅读
C++ 是计算早期流行的编程语言,许多程序和游戏都是为 DOS(磁盘操作系统)环境创建的。由于从 DOS 过渡,许多旧的 C++ 程序不再与现代操作系统兼容...
7 分钟阅读
在本文中,您将通过示例和应用了解。拟合货架问题 在仓库管理或室内设计等现实情况中,拟合货架问题是计算机科学中一个著名的优化问题。以最少的空间浪费并确保没有...
阅读 4 分钟
C++ 模板与 Java 泛型 在开发大型项目时,我们需要代码能够与提供给它的任何类型的数据兼容。这就是您编写的代码与其他代码区分开来的地方。我们在这里的意思是,您编写的代码应该...
阅读 3 分钟
排序算法是计算机科学和数据处理的基础工具。它们能够将数据元素按特定顺序排列,从而更轻松地高效地搜索、检索和分析信息。排序是各种应用程序中的基本操作,从数据库管理...
阅读 23 分钟
在本文中,您将学习如何在 C++ 中按排序顺序打印所有排列,并附有示例。但在开始实现之前,您必须了解 C++ 中的排列和字典序。什么是排列?排列是计算机科学和组合学中的一个基本概念...
阅读 4 分钟
在本文中,我们将讨论如何在 C++ 中读取以空格分隔的输入。如果我们想在 C++ 中读取以空格分隔的输入,我们将使用 cin 对象以及提取运算符“>>”。程序 1:让我们通过一个示例来说明如何读取以空格分隔的...
阅读 4 分钟
在大学里,对大量数据进行分析,并将结果用于组织管理。大学管理部门会及时更新学院列表及其不同的专业,以及负责考试和结果的部门……
阅读 13 分钟
在编程领域,数据是中心。数据的存储、操作和访问方式会对程序的效率和有效性产生重大影响。C++ 提供了抽象数据类型 (ADT) 的强大概念来促进这些任务。ADT 提供了...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India