C++ 中的 std::to_address2025 年 5 月 12 日 | 阅读 4 分钟 获取对象地址的一种安全方法,无论是智能指针的实例还是容器的元素,都是使用实用函数 std::to_address,它在 C++17 中添加到 C++ 标准库。在 C++ 中,当处理特定容器(如 std::vector 或 std::deque)中包含的元素或智能指针管理的对象时,直接使用取地址运算符 (&) 获取对象的地址可能会导致未定义行为。这可能是因为智能指针对于类似指针的行为有特殊的实现,并且这些容器可能不会以顺序的方式在内存中存储其组件。 std::to_address 提供了一种标准化的方法来获取对象地址,适用于智能指针和容器元素,从而解决了这个问题。它特别有助于将原始指针传递给接受原始指针作为参数的函数或旧版 C API。 std::to_address 函数首次在 C++20 中引入,用于在不创建指针引用的情况下检索所提供的指针表示的地址。请注意,*ptr 并不总是对象,因此当前的 std::addressof 无法执行 std::addressof(*ptr)。我们的问题由 std::to_address 解决。 语法它具有以下语法:参数: 需要查找其地址的 fancy 或原始指针作为参数传递给此方法。 返回值: 此方法返回原始指针,即指针 p 的地址。 示例 1让我们举一个例子来说明 C++ 中的 std::to_address。 输出 Allocating memory for 1 elements Allocating memory for 2 elements Deallocating memory for 1 elements Allocating memory for 4 elements Deallocating memory for 2 elements Allocating memory for 8 elements Deallocating memory for 4 elements Address of element: 0xeeb300 Address of element: 0xeeb304 Address of element: 0xeeb308 Address of element: 0xeeb30c Address of element: 0xeeb310 Deallocating memory for 8 elements 示例 2让我们再举一个例子来说明 C++ 中的 std::to_address。 输出 Using std::addressof with std::vector Allocating memory for 1 elements Allocating memory for 2 elements Deallocating memory for 1 elements Address of element: 0x11d42e0 Address of element: 0x11d42e4 Using std::addressof with raw pointer Address of x: 0x7ffeb08fd53c Deallocating memory for 2 elements 结论在 C++ 中,使用 std::to_address 提供了一种标准化且安全的方法来查找对象的内存地址,尤其是在使用智能指针或容器元素时。在直接使用取地址运算符 (&) 获取地址可能导致未定义行为的情况下,此函数非常有用,特别是在处理非连续容器元素或自定义智能指针时。使用 std::to_address 允许程序员保证与各种指针和容器类型的兼容性,从而产生更可靠和健壮的代码。此外,std::addressof 是处理原始指针的良好替代品,因为它提供了在不同场景中获取内存地址的统一方法。 |
简介:数学和编程经常结合起来以有效的方式解决复杂问题。Midy 定理是一个鲜为人知但又引人入胜的数论结果,它提供了对有理数循环小数分数的见解。在本文中,我们将探讨 Midy 定理的数学基础...
5 分钟阅读
C++ 数据类型定义 C++ 中的数据类型对变量可以存储的不同信息种类进行分类。不同的数据类型具有不同的属性,例如它们可以保存的值范围以及它们可以执行的操作。整数 (int)、字符 (char)、浮点数......
阅读9分钟
Shamir 秘密共享算法简介 Shamir 秘密共享算法是用于将秘密分割成秘密份额的技术之一,这些秘密份额被分发给一组参与者,并在达到一定最小数量(称为阈值)时重新组合成原始秘密。
11 分钟阅读
在本文中,我们将讨论 C++ 中的中心立方数。在讨论 C++ 中的中心立方数之前。我们必须了解公式,如时间复杂度和空间复杂度。中心立方数:中心立方数是一种独特的图数,代表创建的三维结构...
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 McCreight 算法,包括其历史、实现等。McCreight 算法简介:McCreight 构建后缀树的方法是一个重要的算法。它是一种用于字符串处理和模式匹配的数据结构。它由 Edward M. McCreight 创建...
阅读 13 分钟
引言 C++ 和 Kotlin 是两种截然不同的编程语言,它们服务于不同的目标,这些目标源于不同的理念,并且是为不同的用户构建的。C++ 是一种通用编程语言,也是系统/软件开发中最常用的语言,而 Kotlin 则是...
5 分钟阅读
引言 在内存分配方面,C++ 语言始终允许用户定义自己的分配器,负责内存的分配、去分配和重用。这些分配器与类型绑定;每个使用分配器的容器或类都必须嵌入它。这些...
阅读 13 分钟
简介 面无表情是构成编程逻辑技能的基础的重要模式之一。在本节中,我们将通过循环和条件语句编写一个 C++ 程序来打印面无表情。此任务需要形成一个......
5 分钟阅读
在本文中,我们将找到一个数字的切换位,除了第一个和最后一个位之外。给定一个数字,目标是切换除第一个和最后一个位之外的所有位。示例:输入:11 输出:13 二进制表示:- 1 0 1 1 切换第一个和最后一个位后:1...
阅读 2 分钟
在本文中,您将通过几个示例了解如何使用 C++ 中的 DSU 检测图中的循环。图:图是由节点(顶点)和连接节点对的边组成的集合。图可以是定向的或非定向的,并且可以分配权重……
阅读20分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India