C++ 中的 std::to_address

2025 年 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 是处理原始指针的良好替代品,因为它提供了在不同场景中获取内存地址的统一方法。