std::to_address in C++ with Examples

The std::to_address, introduced in C++20, is used to obtain the address represented by the specified pointer without forming a reference to the pointee. The existing std::addressof cannot do std::addressof(*ptr) because *ptr isn’t always an object. The std::to_address solves these issues for us.

Syntax:

template class Ptr
constexpr auto to_address(const Ptr& p) noexcept;

template class T
constexpr T* to_address(T* p) noexcept;

Parameters: This method accepts a parameter p which is the fancy or raw pointer whose address is to be found.



Return value: This method returns the Raw pointer that represents the address of pointer p.

Below examples demonstrate the use of std::address
Example 1:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ code to show
// the use of std::address
  
#include <iostream>
#include <memory>
using namespace std;
  
// Allocate memory and return
// the pointer to that memory
template <class A>
auto allocator_new(A& a)
{
    auto p = a.allocate(1);
    try {
        allocator_traits<A>::construct(
            a, to_address(p));
    }
    catch (...) {
        a.deallocate(p, 1);
        throw;
    }
  
    cout << "Pointer to Memory allocated: "
         << p << endl;
    return p;
}
  
// Delete memory using
// pointer to that memory
template <class A>
void allocator_delete(
    A& a,
    typename allocator_traits<A>::pointer p)
{
    allocator_traits<A>::destroy(
        a, to_address(p));
    a.deallocate(p, 1);
    cout << "Pointer to Memory deleted: "
         << p << endl;
}
  
// Driver code
int main()
{
    allocator<int> a;
    auto p = allocator_new(a);
    allocator_delete(a, p);
}

chevron_right


Output:

Pointer to Memory allocated: 0x1512c20
Pointer to Memory deleted: 0x1512c20

Example 2:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ code to show
// the use of std::address
  
#include <iostream>
#include <memory>
using namespace std;
  
int main()
{
  
    // Make a unique pointer and
    // use to_address to get its address
    // from heap memory
    cout << "Using unique pointers\n\n";
    auto ptr = make_unique<int>(15);
    cout << "Address of pointer to 15: "
         << to_address(ptr) << "\n";
  
    auto ptr1 = make_unique<int>(17);
    cout << "Address of pointer to 17: "
         << to_address(ptr1) << "\n";
  
    // Use to_address to get the
    // address of a dumb pointer
    // from stack memory
    cout << "\nUsing dumb pointers\n\n";
  
    int i = 17;
    cout << "Address of pointer to 17: "
         << to_address(&i) << "\n";
  
    int j = 18;
    cout << "Address of pointer to 18: "
         << to_address(&j) << "\n";
  
    return 0;
}

chevron_right


Output:

Using unique pointers

Address of pointer to 15: 0x181ec30
Address of pointer to 17: 0x181ec50

Using dumb pointers

Address of pointer to 17: 0x7fff6b454398
Address of pointer to 18: 0x7fff6b45439c

Reference: https://en.cppreference.com/w/cpp/memory/to_address

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.