funciones<memory>

addressof

Obtiene la dirección real de un objeto.

template <class T>
T* addressof(
    T& value) noexcept;    // before C++17

template <class T>
constexpr T* addressof(
    T& value) noexcept;    // C++17

template <class T>
const T* addressof(
    const T&& value) = delete;   // C++17

Parámetros

value
Objeto o función para el que se va a obtener la dirección real.

Valor devuelto

Dirección real del objeto o la función a la que hace referencia value, incluso si existe un operator&() sobrecargado.

Comentarios

align

Encaja el almacenamiento del tamaño especificado, alineado según la especificación de alineación indicada, en la primera dirección posible del almacenamiento especificado.

void* align(
    size_t alignment, // input
    size_t size,      // input
    void*& ptr,       // input/output
    size_t& space     // input/output
);

Parámetros

alignment
Límite de alineación que se va a intentar.

size
Tamaño en bytes del almacenamiento alineado.

ptr
Dirección inicial del bloque de almacenamiento contiguo disponible que se va a usar. Este parámetro también es un parámetro de salida, y está configurado para contener la nueva dirección inicial si la alineación se realiza correctamente. Si align() no se realiza correctamente, este parámetro no se modifica.

space
Espacio total disponible para align() que se va a usar para crear el almacenamiento alineado. Este parámetro también es un parámetro de salida, y contiene espacio ajustado que queda en el búfer de almacenamiento después de restar el almacenamiento alineado y cualquier sobrecarga asociada.

Si align() no se realiza correctamente, este parámetro no se modifica.

Valor devuelto

Puntero NULL si el búfer alineado solicitado no cabría en el espacio disponible; de lo contrario, es el nuevo valor de ptr.

Comentarios

Los parámetros ptr y space modificados permiten llamar a align() repetidamente en el mismo búfer, posiblemente con valores diferentes para alignment y size. En el fragmento de código siguiente se muestra un uso de align().

#include <type_traits> // std::alignment_of()
#include <memory>
//...
char buffer[256]; // for simplicity
size_t alignment = std::alignment_of<int>::value;
void * ptr = buffer;
std::size_t space = sizeof(buffer); // Be sure this results in the true size of your buffer

while (std::align(alignment, sizeof(MyObj), ptr, space)) {
    // You now have storage the size of MyObj, starting at ptr, aligned on
    // int boundary. Use it here if you like, or save off the starting address
    // contained in ptr for later use.
    // ...
    // Last, move starting pointer and decrease available space before
    // the while loop restarts.
    ptr = reinterpret_cast<char*>(ptr) + sizeof(MyObj);
    space -= sizeof(MyObj);
}
// At this point, align() has returned a null pointer, signaling it is not
// possible to allow more aligned storage in this buffer.

allocate_shared

Crea un elemento shared_ptr en objetos asignados y construidos para un tipo determinado mediante un asignador especificado. Devuelve shared_ptr.

template <class T, class Allocator, class... Args>
shared_ptr<T> allocate_shared(
    Allocator alloc,
    Args&&... args);

Parámetros

alloc
Asignador usado para crear objetos.

args
Cero o más argumentos que se convierten en los objetos.

Comentarios

La función crea el objeto shared_ptr<T>, un puntero a T(args...) según ha sido asignado y construido por alloc.

atomic_compare_exchange_strong

template<class T>
bool atomic_compare_exchange_strong(
    shared_ptr<T>* u,
    shared_ptr<T>* v,
    shared_ptr<T> w);

atomic_compare_exchange_weak

template<class T>
bool atomic_compare_exchange_weak(
    shared_ptr<T>* u,
    shared_ptr<T>* v,
    shared_ptr<T> w);

atomic_compare_exchange_strong_explicit

template<class T>
bool atomic_compare_exchange_strong_explicit(
    shared_ptr<T>* u,
    shared_ptr<T>* v,
    shared_ptr<T> w,
    memory_order success,
    memory_order failure);

atomic_compare_exchange_weak_explicit

template<class T>
bool atomic_compare_exchange_weak_explicit(
    shared_ptr<T>* u,
    shared_ptr<T>* v,
    shared_ptr<T> w,
    memory_order success,
    memory_order failure);

atomic_exchange

template<class T>
shared_ptr<T> atomic_exchange(
    shared_ptr<T>* u,
    shared_ptr<T> r);

atomic_exchange_explicit

template<class T>
shared_ptr<T> atomic_exchange_explicit(
    shared_ptr<T>* u,
    shared_ptr<T> r,
    memory_order mo);

atomic_is_lock_free

template<class T>
bool atomic_is_lock_free(
    const shared_ptr<T>* u);

atomic_load

template<class T>
shared_ptr<T> atomic_load(
    const shared_ptr<T>* u);

atomic_load_explicit

template<class T>
shared_ptr<T> atomic_load_explicit(
    const shared_ptr<T>* u,
    memory_order mo);

atomic_store

template<class T>
void atomic_store(
    shared_ptr<T>* u,
    shared_ptr<T> r);

atomic_store_explicit

template<class T>
void atomic_store_explicit(
    shared_ptr<T>* u,
    shared_ptr<T> r,
    memory_order mo);

const_pointer_cast

Const convertida en shared_ptr.

template <class T, class Other>
shared_ptr<T> const_pointer_cast(
    const shared_ptr<Other>& sp) noexcept;

template <class T, class Other>
shared_ptr<T> const_pointer_cast(
    shared_ptr<Other>&& sp) noexcept;

Parámetros

T
Tipo controlado por el puntero compartido devuelto.

Other
Tipo controlado por el puntero compartido de argumento.

sp
Puntero compartido de argumento.

Comentarios

La función de plantilla devuelve un objeto shared_ptr vacío si const_cast<T*>(sp.get()) devuelve un puntero nulo; en caso contrario, devuelve un objeto shared_ptr<T> que posee el recurso que es propiedad de sp. La expresión const_cast<T*>(sp.get()) debe ser válida.

Ejemplo

// std__memory__const_pointer_cast.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

int main()
{
    std::shared_ptr<int> sp0(new int);
    std::shared_ptr<const int> sp1 =
        std::const_pointer_cast<const int>(sp0);

    *sp0 = 3;
    std::cout << "sp1 == " << *sp1 << std::endl;

    return (0);
}
sp1 == 3

declare_no_pointers

Informa a un recolector de elementos no usados de que los caracteres del bloque de memoria definidos por un puntero de dirección base y el tamaño del bloque no contienen punteros rastreables.

void declare_no_pointers(
    char* ptr,
    size_t size);

Parámetros

ptr
Dirección del primer carácter que ya no contiene punteros rastreables.

size
Tamaño del bloque que comienza por ptr que no contiene punteros rastreables.

Comentarios

La función informa a cualquier recolector de elementos no utilizados de que el intervalo de direcciones [ptr, ptr + size) ya no contiene punteros rastreables (no se puede deshacer la referencia a ningún puntero que señale a un almacenamiento asignado, a no ser que sea accesible).

declare_reachable

Informa a la recolección de elementos no utilizados de que la dirección indicada es para el almacenamiento asignado y es accesible.

void declare_reachable(
    void* ptr);

Parámetros

ptr
Un puntero para un área de almacenamiento válida, asignada, accesible.

Comentarios

Si ptr no es NULL, la función informa a cualquier recolector de elementos no usados de que ptr ahora es accesible, esto es, señala a un almacenamiento asignado válido.

default_delete

Elimina objetos asignados a operator new. Apto para el uso con unique_ptr.

struct default_delete
{
    constexpr default_delete() noexcept = default;

    template <class Other, class = typename enable_if<is_convertible<Other*, T*>::value, void>::type>>
    default_delete(const default_delete<Other>&) noexcept;

    void operator()(T* ptr) const noexcept;
};

Parámetros

ptr
Puntero al objeto que se va a eliminar.

Other
Tipo de los elementos de la matriz que se va a borrar.

Comentarios

La plantilla de clase describe un eliminador que elimina objetos escalares asignados con operator new; su uso es adecuado con la plantilla de clase unique_ptr. También tiene la especialización explícita default_delete<T[]>.

destroy_at

template <class T>
void destroy_at(
    T* location);

Igual a location->~T().

destroy

template <class ForwardIterator>
void destroy(
    ForwardIterator first,
    ForwardIterator last);

Igual que:

for (; first != last; ++first)
    destroy_at(addressof(*first));

destroy_n

template <class ForwardIterator, class Size>
ForwardIterator destroy_n(
    ForwardIterator first,
    Size count);

Igual que:

for (; count > 0; (void)++first, --count)
    destroy_at(addressof(*first));
return first;

dynamic_pointer_cast

Conversión dinámica en shared_ptr.

template <class T, class Other>
shared_ptr<T> dynamic_pointer_cast(
    const shared_ptr<Other>& sp) noexcept;

template <class T, class Other>
shared_ptr<T> dynamic_pointer_cast(
    shared_ptr<Other>&& sp) noexcept;

Parámetros

T
Tipo controlado por el puntero compartido devuelto.

Other
Tipo controlado por el puntero compartido de argumento.

sp
Puntero compartido de argumento.

Comentarios

La función de plantilla devuelve un objeto shared_ptr vacío si dynamic_cast<T*>(sp.get()) devuelve un puntero nulo; en caso contrario, devuelve un objeto shared_ptr<T> que posee el recurso que es propiedad de sp. La expresión dynamic_cast<T*>(sp.get()) debe ser válida.

Ejemplo

// std__memory__dynamic_pointer_cast.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

struct base
{
    virtual ~base() {}
    int value;
};

struct derived
    : public base
{
};

int main()
{
    std::shared_ptr<base> sp0(new derived);
    std::shared_ptr<derived> sp1 =
        std::dynamic_pointer_cast<derived>(sp0);

    sp0->value = 3;
    std::cout << "sp1->value == " << sp1->value << std::endl;

    return (0);
}
sp1->value == 3

get_deleter

Obtiene el eliminador de un objeto shared_ptr.

template <class Deleter, class T>
Deleter* get_deleter(
    const shared_ptr<T>& sp) noexcept;

Parámetros

Deleter
Tipo del eliminador.

T
Tipo controlado por el puntero compartido.

sp
El puntero compartido.

Comentarios

La función de plantilla devuelve un puntero al eliminador de tipo Deleter que pertenece al objeto sp de shared_ptr. Si sp no tiene eliminador o si su eliminador no es de tipo Deleter, la función devuelve 0.

Ejemplo

// std__memory__get_deleter.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

struct base
{
    int value;
};

struct deleter
{
    void operator()(base *pb)
    {
        delete pb;
    }
};

int main()
{
    std::shared_ptr<base> sp0(new base);

    sp0->value = 3;
    std::cout << "get_deleter(sp0) != 0 == " << std::boolalpha
        << (std::get_deleter<deleter>(sp0) != 0) << std::endl;

    std::shared_ptr<base> sp1(new base, deleter());

    sp0->value = 3;
    std::cout << "get_deleter(sp1) != 0 == " << std::boolalpha
        << (std::get_deleter<deleter>(sp1) != 0) << std::endl;

    return (0);
}
get_deleter(sp0) != 0 == false
get_deleter(sp1) != 0 == true

get_pointer_safety

Devuelve el tipo de seguridad del puntero asumido por cualquier recolector de elementos no utilizados.

pointer_safety get_pointer_safety() noexcept;

Comentarios

La función devuelve el tipo de seguridad del puntero asumido por cualquier recolector de elementos no utilizados automático.

get_temporary_buffer

Asigna almacenamiento temporal para una secuencia de elementos que no supere un número especificado de elementos.

template <class T>
pair<T *, ptrdiff_t> get_temporary_buffer(
    ptrdiff_t count);

Parámetros

count
El número máximo de elementos solicitados para los que va a asignarse la memoria.

Valor devuelto

Un pair cuyo primer componente es un puntero a la memoria que se ha asignado, y cuyo segundo componente proporciona el tamaño del búfer, que indica el número máximo de elementos que puede almacenar.

Comentarios

La función realiza una solicitud para la memoria y puede que no se realice correctamente. Si no se asigna ningún búfer, entonces la función devuelve un par, con el segundo componente igual a cero y el primer componente igual al puntero nulo.

Use esta función exclusivamente con la memoria que sea temporal.

Ejemplo

// memory_get_temp_buf.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

using namespace std;

int main( )
{
    // Create an array of ints
    int intArray [] = { 10, 20, 30, 40, 100, 200, 300, 1000, 2000 };
    int count = sizeof ( intArray ) / sizeof ( int );
    cout << "The number of integers in the array is: "
        << count << "." << endl;

    pair<int *, ptrdiff_t> resultPair;
    resultPair = get_temporary_buffer<int>( count );

    cout << "The number of elements that the allocated memory\n"
        << "could store is given by: resultPair.second = "
        << resultPair.second << "." << endl;
}
The number of integers in the array is: 9.
The number of elements that the allocated memory
could store is given by: resultPair.second = 9.

make_shared

Crea y devuelve un shared_ptr que apunta a los objetos asignados que se construyen a partir de cero o más argumentos mediante el asignador predeterminado. Asigna y crea tanto un objeto del tipo especificado como un shared_ptr para administrar una propiedad compartida del objeto y devuelve el elemento shared_ptr.

template <class T, class... Args>
shared_ptr<T> make_shared(
    Args&&... args);

Parámetros

args
Cero o más argumentos de constructor. La función deduce qué sobrecarga de constructor invocar según los argumentos que se proporcionan.

Comentarios

Use make_shared como una manera más eficaz y sencilla de crear un objeto y un shared_ptr para administrar el acceso compartido al objeto al mismo tiempo. Semánticamente, estas dos instrucciones son equivalentes:

auto sp = std::shared_ptr<Example>(new Example(argument));
auto msp = std::make_shared<Example>(argument);

Sin embargo, la primera instrucción hace dos asignaciones y, si en la asignación de shared_ptr se produce un error después de que la asignación del objeto Example se haya realizado correctamente, el objeto Example sin nombre se pierde. La instrucción que usa make_shared es más sencilla porque hay solo una llamada a función implicada. Es más eficaz porque la biblioteca puede realizar una única asignación para tanto el objeto como el puntero inteligente. Esta función es más rápida y genera menos fragmentación de la memoria, y no existe ninguna posibilidad de que se produzca una excepción en una asignación, pero no en la otra. El rendimiento mejora por el mejor emplazamiento del código que hace referencia al objeto y que actualiza los recuentos de referencia en el puntero inteligente.

Considere el uso de make_unique si no necesita acceso compartido al objeto. Use allocate_shared si necesita especificar un asignador personalizado para el objeto. No se puede usar make_shared si el objeto requiere un eliminador personalizado, porque no hay ninguna manera de pasar el eliminador como argumento.

En el ejemplo siguiente se muestra cómo crear punteros compartidos a un tipo invocando determinadas sobrecargas de constructor.

Ejemplo

// stl_make_shared.cpp
// Compile by using: cl /W4 /EHsc stl_make_shared.cpp
#include <iostream>
#include <string>
#include <memory>
#include <vector>

class Song {
public:
    std::wstring title_;
    std::wstring artist_;

    Song(std::wstring title, std::wstring artist) : title_(title), artist_(artist) {}
    Song(std::wstring title) : title_(title), artist_(L"Unknown") {}
};

void CreateSharedPointers()
{
    // Okay, but less efficient to have separate allocations for
    // Song object and shared_ptr control block.
    auto song = new Song(L"Ode to Joy", L"Beethoven");
    std::shared_ptr<Song> sp0(song);

    // Use make_shared function when possible. Memory for control block
    // and Song object are allocated in the same call:
    auto sp1 = std::make_shared<Song>(L"Yesterday", L"The Beatles");
    auto sp2 = std::make_shared<Song>(L"Blackbird", L"The Beatles");

    // make_shared infers which constructor to use based on the arguments.
    auto sp3 = std::make_shared<Song>(L"Greensleeves");

    // The playlist vector makes copies of the shared_ptr pointers.
    std::vector<std::shared_ptr<Song>> playlist;
    playlist.push_back(sp0);
    playlist.push_back(sp1);
    playlist.push_back(sp2);
    playlist.push_back(sp3);
    playlist.push_back(sp1);
    playlist.push_back(sp2);
    for (auto&& sp : playlist)
    {
        std::wcout << L"Playing " << sp->title_ <<
            L" by " << sp->artist_ << L", use count: " <<
            sp.use_count() << std::endl;
    }
}

int main()
{
    CreateSharedPointers();
}

El ejemplo produce la siguiente salida:

Playing Ode to Joy by Beethoven, use count: 2
Playing Yesterday by The Beatles, use count: 3
Playing Blackbird by The Beatles, use count: 3
Playing Greensleeves by Unknown, use count: 2
Playing Yesterday by The Beatles, use count: 3
Playing Blackbird by The Beatles, use count: 3

make_unique

Crea y devuelve un elemento unique_ptr a un objeto del tipo especificado, que se construye con los argumentos especificados.

// make_unique<T>
template <class T, class... Args>
unique_ptr<T> make_unique(Args&&... args);

// make_unique<T[]>
template <class T>
unique_ptr<T> make_unique(size_t size);

// make_unique<T[N]> disallowed
template <class T, class... Args>
/* unspecified */ make_unique(Args&&...) = delete;

Parámetros

T
Tipo del objeto al que apuntará el unique_ptr.

Args
Tipos de los argumentos de constructor especificados por args.

args
Argumentos que se van a pasar al constructor del objeto de tipo T.

elements
Matriz de elementos de tipo T.

size
Número de elementos para los que se va a asignar espacio en la nueva matriz.

Comentarios

La primera sobrecarga se usa en objetos únicos. La segunda sobrecarga se invoca para las matrices. La tercera sobrecarga impide especificar un tamaño de matriz en el argumento de tipo (make_unique<T[N]>); esta construcción no es compatible con el estándar actual. Cuando se utiliza make_unique para crear un unique_ptr para una matriz, se deben inicializar los elementos de la matriz por separado. En lugar de usar esta sobrecarga, quizás una mejor opción sea usar std::vector.

Puesto que make_unique se implementa con cuidado para la seguridad de las excepciones, se recomienda utilizar make_unique en lugar de llamar directamente a los constructores de unique_ptr.

Ejemplo

En el ejemplo siguiente se muestra cómo utilizar make_unique. Para obtener más ejemplos, vea Cómo: Crear y usar instancias de unique_ptr.

class Animal
{
private:
    std::wstring genus;
    std::wstring species;
    int age;
    double weight;
public:
    Animal(const wstring&, const wstring&, int, double){/*...*/ }
    Animal(){}
};

void MakeAnimals()
{
    // Use the Animal default constructor.
    unique_ptr<Animal> p1 = make_unique<Animal>();

    // Use the constructor that matches these arguments
    auto p2 = make_unique<Animal>(L"Felis", L"Catus", 12, 16.5);

    // Create a unique_ptr to an array of 5 Animals
    unique_ptr<Animal[]> p3 = make_unique<Animal[]>(5);

    // Initialize the elements
    p3[0] = Animal(L"Rattus", L"norvegicus", 3, 2.1);
    p3[1] = Animal(L"Corynorhinus", L"townsendii", 4, 1.08);

    // auto p4 = p2; //C2280

    vector<unique_ptr<Animal>> vec;
    // vec.push_back(p2); //C2280
    // vector<unique_ptr<Animal>> vec2 = vec; // C2280

    // OK. p2 no longer points to anything
    vec.push_back(std::move(p2)); 

    // unique_ptr overloads operator bool
    wcout << boolalpha << (p2 == false) << endl; // Prints "true"

    // OK but now you have two pointers to the same memory location
    Animal* pAnimal = p2.get();

    // OK. p2 no longer points to anything
    Animal* p5 = p2.release();
}

Cuando aparezca el error C2280 con respecto a un unique_ptr, es casi seguro que está intentando invocar su constructor de copias, que es una función eliminada.

owner_less

Permite realizar comparaciones mixtas basadas en la propiedad de punteros compartidos y parciales. Devuelve true si el parámetro izquierdo se ordena antes que el parámetro derecho mediante la función miembro owner_before.

template <class T>
    struct owner_less; // not defined

template <class T>
struct owner_less<shared_ptr<T>>
{
    bool operator()(
        const shared_ptr<T>& left,
        const shared_ptr<T>& right) const noexcept;

    bool operator()(
        const shared_ptr<T>& left,
        const weak_ptr<T>& right) const noexcept;

    bool operator()(
        const weak_ptr<T>& left,
        const shared_ptr<T>& right) const noexcept;
};

template <class T>
struct owner_less<weak_ptr<T>>
    bool operator()(
        const weak_ptr<T>& left,
        const weak_ptr<T>& right) const noexcept;

    bool operator()(
        const weak_ptr<T>& left,
        const shared_ptr<T>& right) const noexcept;

    bool operator()(
        const shared_ptr<T>& left,
        const weak_ptr<T>& right) const noexcept;
};

template<> struct owner_less<void>
{
    template<class T, class U>
    bool operator()(
        const shared_ptr<T>& left,
        const shared_ptr<U>& right) const noexcept;

    template<class T, class U>
    bool operator()(
        const shared_ptr<T>& left,
        const weak_ptr<U>& right) const noexcept;

    template<class T, class U>
    bool operator()(
        const weak_ptr<T>& left,
        const shared_ptr<U>& right) const noexcept;

    template<class T, class U>
    bool operator()(
        const weak_ptr<T>& left,
        const weak_ptr<U>& right) const noexcept;
};

Parámetros

left
Un puntero compartido o no seguro.

right
Un puntero compartido o no seguro.

Comentarios

Las plantillas de clase definen todos sus operadores miembro al devolver left.owner_before(right).

reinterpret_pointer_cast

Crea un nuevo objeto shared_ptr a partir de un puntero compartido existente mediante conversión.

template<class T, class U>
shared_ptr<T> reinterpret_pointer_cast(
    const shared_ptr<U>& ptr) noexcept;

template<class T, class U>
shared_ptr<T> reinterpret_pointer_cast(
    shared_ptr<U>&& ptr) noexcept;

Parámetros

ptr
Referencia a shared_ptr<U>.

Comentarios

Si ptr está vacío, el nuevo objeto shared_ptr también lo estará; de lo contrario, comparte la propiedad con ptr. El nuevo puntero compartido es el resultado de evaluar reinterpret_cast<Y*>(ptr.get()), donde Y es typename std::shared_ptr<T>::element_type. El comportamiento no está definido si reinterpret_cast<T*>((U*)nullptr) no tiene un formato correcto.

La función de plantilla que toma una referencia de valor L es nueva en C++17. La función de plantilla que toma una referencia de valor R es nueva en C++20.

return_temporary_buffer

Desasigna la memoria temporal que se asignó mediante la función de plantilla get_temporary_buffer.

template <class T>
void return_temporary_buffer(
    T* buffer);

Parámetros

buffer
Un puntero a la memoria que se va a desasignar.

Comentarios

Use esta función exclusivamente con la memoria que sea temporal.

Ejemplo

// memory_ret_temp_buf.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

using namespace std;

int main( )
{
    // Create an array of ints
    int intArray [] = { 10, 20, 30, 40, 100, 200, 300 };
    int count = sizeof ( intArray ) / sizeof ( int );
    cout << "The number of integers in the array is: "
         << count << "." << endl;

    pair<int *, ptrdiff_t> resultPair;
    resultPair = get_temporary_buffer<int>( count );

    cout << "The number of elements that the allocated memory\n"
         << " could store is given by: resultPair.second = "
         << resultPair.second << "." << endl;

    int* tempBuffer = resultPair.first;

    // Deallocates memory allocated with get_temporary_buffer
    return_temporary_buffer( tempBuffer );
}
The number of integers in the array is: 7.
The number of elements that the allocated memory
could store is given by: resultPair.second = 7.

static_pointer_cast

Conversión estática en shared_ptr.

template <class T, class Other>
shared_ptr<T> static_pointer_cast(
    const shared_ptr<Other>& sp) noexcept;

template <class T, class Other>
shared_ptr<T> static_pointer_cast(
    shared_ptr<Other>&& sp) noexcept;

Parámetros

T
Tipo controlado por el puntero compartido devuelto.

Other
Tipo controlado por el puntero compartido de argumento.

sp
Puntero compartido de argumento.

Comentarios

La función de plantilla devuelve un objeto shared_ptr vacío si sp es un objeto shared_ptr vacío; en caso contrario, devuelve un objeto shared_ptr<T> que posee el recurso que es propiedad de sp. La expresión static_cast<T*>(sp.get()) debe ser válida.

Ejemplo

// std__memory__static_pointer_cast.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

struct base
{
    int value;
};

struct derived
    : public base
{
};

int main()
{
    std::shared_ptr<base> sp0(new derived);
    std::shared_ptr<derived> sp1 =
        std::static_pointer_cast<derived>(sp0);

    sp0->value = 3;
    std::cout << "sp1->value == " << sp1->value << std::endl;

    return (0);
}
sp1->value == 3

swap

Intercambia dos objetos shared_ptr, unique_ptr o weak_ptr.

template <class T>
void swap(
    shared_ptr<T>& left,
    shared_ptr<T>& right) noexcept;

template <class T, class Deleter>
void swap(
    unique_ptr<T, Deleter>& left,
    unique_ptr<T, Deleter>& right) noexcept;

template <class T>
void swap(
    weak_ptr<T>& left,
    weak_ptr<T>& right) noexcept;

Parámetros

T
Tipo controlado por el puntero de argumento.

Deleter
Eliminador del tipo de puntero único.

left
Puntero izquierdo.

right
Puntero derecho.

Comentarios

Las funciones de plantilla llaman a left.swap(right).

Ejemplo

// std__memory__swap.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

int main()
{
    std::shared_ptr<int> sp1(new int(5));
    std::shared_ptr<int> sp2(new int(10));
    std::cout << "*sp1 == " << *sp1 << std::endl;

    sp1.swap(sp2);
    std::cout << "*sp1 == " << *sp1 << std::endl;

    swap(sp1, sp2);
    std::cout << "*sp1 == " << *sp1 << std::endl;
    std::cout << std::endl;

    std::weak_ptr<int> wp1(sp1);
    std::weak_ptr<int> wp2(sp2);
    std::cout << "*wp1 == " << *wp1.lock() << std::endl;

    wp1.swap(wp2);
    std::cout << "*wp1 == " << *wp1.lock() << std::endl;

    swap(wp1, wp2);
    std::cout << "*wp1 == " << *wp1.lock() << std::endl;

    return (0);
}
*sp1 == 5
*sp1 == 10
*sp1 == 5

*wp1 == 5
*wp1 == 10
*wp1 == 5

undeclare_no_pointers

Informa a un recolector de elementos no utilizados de que los caracteres del bloque de memoria definido por un puntero de dirección base y el tamaño del bloque pueden contener ahora punteros rastreables.

void undeclare_no_pointers(
    char* ptr,
    size_t size);

Parámetros

ptr
Puntero a la dirección de memoria marcada anteriormente mediante declare_no_pointers.

size
Es el número de bytes en el rango de memoria. Este valor debe ser igual al número usado en la llamada a declare_no_pointers.

Comentarios

La función informa a cualquier recolector de elementos no utilizados de que ahora el intervalo de direcciones [ptr, ptr + size) puede contener punteros rastreables.

undeclare_reachable

Revoca una declaración de accesibilidad de una ubicación de memoria especificada.

template <class T>
T *undeclare_reachable(
    T* ptr);

Parámetros

ptr
Puntero a la dirección de memoria marcada anteriormente mediante declare_reachable.

Comentarios

Si ptr no es nullptr, la función informa a cualquier recolector de elementos no utilizados de que ptr ya no es accesible. Devuelve un puntero derivado de forma segura que equivale a ptr.

uninitialized_copy

Copia objetos de un intervalo de origen especificado a un intervalo de destino sin inicializar.

template <class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(
    InputIterator first,
    InputIterator last,
    ForwardIterator dest);

template <class ExecutionPolicy, class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(
    ExecutionPolicy&& policy,
    InputIterator first,
    InputIterator last,
    ForwardIterator dest);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador de entrada que direcciona el primer elemento del intervalo de origen.

last
Iterador de entrada que direcciona el último elemento del intervalo de origen.

dest
Iterador hacia delante que direcciona el primer elemento del intervalo de destino.

Valor devuelto

Un iterador hacia delante que direcciona la primera posición más allá del intervalo de destino, a menos que el intervalo de origen esté vacío.

Comentarios

Este algoritmo permite desacoplar la asignación de memoria de la construcción de objetos.

La función de plantilla ejecuta eficazmente:

while (first != last)
{
    new (static_cast<void*>(&* dest++))
        typename iterator_traits<InputIterator>::value_type(*first++);
}
return dest;

a menos que el código produzca una excepción. En ese caso, se destruyen todos los objetos construidos y la vuelve a producir excepción.

La sobrecarga con una directiva de ejecución es nueva en C++17.

Ejemplo

// memory_uninit_copy.cpp
// compile with: /EHsc /W3
#include <memory>
#include <iostream>

using namespace std;

class Integer
{
public:
    Integer(int x) : value(x) {}
    int get() { return value; }
private:
    int value;
};

int main()
{
    int Array[] = { 10, 20, 30, 40 };
    const int N = sizeof(Array) / sizeof(int);

    cout << "The initialized Array contains " << N << " elements: ";
    for (int i = 0; i < N; i++)
    {
        cout << " " << Array[i];
    }
    cout << endl;

    Integer* ArrayPtr = (Integer*)malloc(N * sizeof(int));
    Integer* LArrayPtr = uninitialized_copy(
        Array, Array + N, ArrayPtr);  // C4996

    cout << "Address of position after the last element in the array is: "
        << &Array[0] + N << endl;
    cout << "The iterator returned by uninitialized_copy addresses: "
        << (void*)LArrayPtr << endl;
    cout << "The address just beyond the last copied element is: "
        << (void*)(ArrayPtr + N) << endl;

    if ((&Array[0] + N) == (void*)LArrayPtr)
        cout << "The return value is an iterator "
        << "pointing just beyond the original array." << endl;
    else
        cout << "The return value is an iterator "
        << "not pointing just beyond the original array." << endl;

    if ((void*)LArrayPtr == (void*)(ArrayPtr + N))
        cout << "The return value is an iterator "
        << "pointing just beyond the copied array." << endl;
    else
        cout << "The return value is an iterator "
        << "not pointing just beyond the copied array." << endl;

    free(ArrayPtr);

    cout << "Note that the exact addresses returned will vary\n"
        << "with the memory allocation in individual computers."
        << endl;
}

uninitialized_copy_n

Crea una copia de un número especificado de elementos de un iterador de entrada. Las copias se colocan en un iterador hacia delante.

template <class InputIterator, class Size, class ForwardIterator>
ForwardIterator uninitialized_copy_n(
    InputIterator first,
    Size count,
    ForwardIterator dest);

template <class ExecutionPolicy, class InputIterator, class Size, class ForwardIterator>
ForwardIterator uninitialized_copy_n(
    ExecutionPolicy&& policy,
    InputIterator first,
    Size count,
    ForwardIterator dest);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador de entrada que hace referencia al objeto que se va a copiar.

count
Tipo entero con signo o sin signo que especifica el número de veces que se va a copiar el objeto.

dest
Iterador hacia delante que hace referencia a dónde van las nuevas copias.

Valor devuelto

Iterador hacia delante que direcciona la primera posición más allá del destino. Si el intervalo de origen estaba vacío, el iterador direcciona first.

Comentarios

La función de plantilla ejecuta de facto el siguiente código:

    for (; 0 < count; --count)
        new (static_cast<void*>(&* dest++))
            typename iterator_traits<InputIterator>::value_type(*first++);
    return dest;

a menos que el código produzca una excepción. En ese caso, se destruyen todos los objetos construidos y la vuelve a producir excepción.

La sobrecarga con una directiva de ejecución es nueva en C++17.

uninitialized_default_construct

El valor predeterminado construye objetos de tipo value_type de los iteradores dentro del intervalo especificado.

template <class ForwardIterator>
void uninitialized_default_construct(
    ForwardIterator first,
    ForwardIterator last);

template <class ExecutionPolicy, class ForwardIterator>
void uninitialized_default_construct(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    ForwardIterator last);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador que dirige al primer elemento del intervalo que se va a construir.

last
Iterador que dirige a un elemento más allá del último elemento del intervalo que se va a construir.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; first != last; ++first)
    ::new (static_cast<void*>(addressof(*first)))
        typename iterator_traits<ForwardIterator>::value_type;

Si se produce una excepción, los objetos construidos anteriormente se destruyen en un orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Estas funciones son nuevas en C++17.

uninitialized_default_construct_n

Construye de forma predeterminada el número de objetos especificado de tipo value_type del iterador, empezando por la ubicación especificada.

template <class ForwardIterator, class Size>
ForwardIterator uninitialized_default_construct_n(
    ForwardIterator first,
    Size count);

template <class ExecutionPolicy, class ForwardIterator, class Size>
ForwardIterator uninitialized_default_construct_n(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    Size count);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador que direcciona el primer elemento del intervalo de destino que se va a construir.

count
Cantidad de elementos del intervalo de destino que se van a construir.

Valor devuelto

Un iterador hacia delante que direcciona la primera posición más allá del intervalo de destino, a menos que el intervalo de origen esté vacío.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; count>0; (void)++first, --count)
    ::new (static_cast<void*>(addressof(*first)))
        typename iterator_traits<ForwardIterator>::value_type;
return first;

Si se produce una excepción, los objetos construidos anteriormente se destruyen en un orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Estas funciones son nuevas en C++17.

uninitialized_fill

Copia objetos de un valor especificado en un intervalo de destino sin inicializar.

template <class ForwardIterator, class T>
void uninitialized_fill(
    ForwardIterator first,
    ForwardIterator last,
    const T& value);

template <class ExecutionPolicy, class ForwardIterator, class T>
void uninitialized_fill(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    ForwardIterator last,
    const T& value);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador hacia delante que direcciona el primer elemento del intervalo de destino que se va a inicializar.

last
Iterador hacia delante que direcciona el último elemento del intervalo de destino que se va a inicializar.

value
Valor que se usará para inicializar el intervalo de destino.

Comentarios

Este algoritmo permite desacoplar la asignación de memoria de la construcción de objetos.

La función de plantilla ejecuta eficazmente:

while (first != last)
    new (static_cast<void*>(&* first ++))
        typename iterator_traits<ForwardIterator>::value_type (value);

a menos que el código produzca una excepción. En ese caso, se destruyen todos los objetos construidos y la vuelve a producir excepción.

La sobrecarga con una directiva de ejecución es nueva en C++17.

Ejemplo

// memory_uninit_fill.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>

using namespace std;

class Integer
{
public:
    // No default constructor
    Integer( int x ) : value( x ) {}
    int get() { return value; }
private:
    int value;
};

int main()
{
    const int N = 10;
    Integer value ( 25 );
    Integer* Array = ( Integer* ) malloc( N * sizeof( int ) );
    uninitialized_fill( Array, Array + N, value );
    cout << "The initialized Array contains: ";
    for ( int i = 0; i < N; i++ )
        {
            cout << Array[ i ].get() << " ";
        }
    cout << endl;
}
The initialized Array contains: 25 25 25 25 25 25 25 25 25 25

uninitialized_fill_n

Copia objetos de un valor especificado en el número de elementos especificado de un intervalo de destino sin inicializar.

template <class ForwardIterator, class Size, class T>
ForwardIterator uninitialized_fill_n(
    ForwardIterator first,
    Size count,
    const T& value);

template <class ExecutionPolicy, class ForwardIterator, class Size, class T>
ForwardIterator uninitialized_fill_n(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    Size count,
    const T& value);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador hacia delante que direcciona el primer elemento del intervalo de destino que se va a inicializar.

count
Número de elementos que se van a inicializar.

value
Valor que se usará para inicializar el intervalo de destino.

Comentarios

Este algoritmo permite desacoplar la asignación de memoria de la construcción de objetos.

La función de plantilla ejecuta eficazmente:

while (0 < count--)
    new (static_cast<void*>(&* first++))
        typename iterator_traits<ForwardIterator>::value_type(value);
return first;

a menos que el código produzca una excepción. En ese caso, se destruyen todos los objetos construidos y la vuelve a producir excepción.

La sobrecarga con una directiva de ejecución es nueva en C++17.

Ejemplo

// memory_uninit_fill_n.cpp
// compile with: /EHsc /W3
#include <memory>
#include <iostream>

using namespace std;

class Integer
{
public:
    // No default constructor
    Integer( int x ) : value( x ) {}
    int get() { return value; }
private:
    int value;
};

int main()
{
    const int N = 10;
    Integer value( 60 );
    Integer* Array = ( Integer* ) malloc( N * sizeof( int ) );
    uninitialized_fill_n( Array, N, value );  // C4996
    cout << "The uninitialized Array contains: ";
    for ( int i = 0; i < N; i++ )
        cout << Array[ i ].get() <<  " ";
}

uninitialized_move

Mueve los elementos de un intervalo de origen a un área de memoria de destino no inicializada.

template <class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_move(
    InputIterator first,
    InputIterator last,
    ForwardIterator dest);

template <class ExecutionPolicy, class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_move(
    ExecutionPolicy&& policy,
    InputIterator first,
    InputIterator last,
    ForwardIterator dest);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador de entrada que direcciona el primer elemento del intervalo de origen que se va a mover.

last
Iterador de entrada que direcciona un elemento más allá del último elemento del intervalo de origen que se va a mover.

dest
Principio del intervalo de destino.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; first != last; (void)++dest, ++first)
    ::new (static_cast<void*>(addressof(*dest)))
        typename iterator_traits<ForwardIterator>::value_type(std::move(*first));
return dest;

Si se produce una excepción, algunos objetos del intervalo de origen podrían dejarse en un estado válido, pero no especificado. Los objetos construidos anteriormente se destruyen en orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Estas funciones son nuevas en C++17.

uninitialized_move_n

Mueve un número especificado de elementos de un intervalo de origen a un área de memoria de destino no inicializada.

template <class InputIterator, class Size, class ForwardIterator>
pair<InputIterator, ForwardIterator> uninitialized_move_n(
    InputIterator first,
    Size count,
    ForwardIterator dest);

template <class ExecutionPolicy, class InputIterator, class Size, class ForwardIterator>
pair<InputIterator, ForwardIterator> uninitialized_move_n(
    ExecutionPolicy&& policy,
    InputIterator first,
    Size count,
    ForwardIterator dest);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador de entrada que direcciona el primer elemento del intervalo de origen que se va a mover.

count
Número de elementos del intervalo de origen que se van a mover.

dest
Principio del intervalo de destino.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; count > 0; ++dest, (void) ++first, --count)
    ::new (static_cast<void*>(addressof(*dest)))
        typename iterator_traits<ForwardIterator>::value_type(std::move(*first));
return {first, dest};

Si se produce una excepción, algunos objetos del intervalo de origen podrían dejarse en un estado válido, pero no especificado. Los objetos construidos anteriormente se destruyen en orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Estas funciones son nuevas en C++17.

uninitialized_value_construct

Construye objetos de tipo value_type de los iteradores según su inicialización de valor en el intervalo especificado.

template <class ForwardIterator>
void uninitialized_value_construct(
    ForwardIterator first,
    ForwardIterator last);

template <class ExecutionPolicy, class ForwardIterator>
void uninitialized_value_construct(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    ForwardIterator last);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador que dirige al primer elemento del intervalo cuyo valor se va a construir.

last
Iterador que dirige a un elemento más allá del último elemento del intervalo cuyo valor se va a construir.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; first != last; ++first)
    ::new (static_cast<void*>(addressof(*first)))
        typename iterator_traits<ForwardIterator>::value_type();

Si se produce una excepción, los objetos construidos anteriormente se destruyen en un orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Si se produce un error de asignación de memoria, se inicia una excepción std::bad_alloc.

Estas funciones son nuevas en C++17.

uninitialized_value_construct_n

Construye el número de objetos especificado de tipo value_type del iterador según la inicialización de valor, empezando por la ubicación especificada.

template <class ForwardIterator, class Size>
ForwardIterator uninitialized_value_construct_n(
    ForwardIterator first,
    Size count);

template <class ExecutionPolicy, class ForwardIterator, class Size>
ForwardIterator uninitialized_value_construct_n(
    ExecutionPolicy&& policy,
    ForwardIterator first,
    Size count);

Parámetros

policy
La directiva de ejecución que se va a usar.

first
Iterador que direcciona el primer elemento del intervalo de destino que se va a construir.

count
Cantidad de elementos del intervalo de destino que se van a construir.

Comentarios

La versión sin una directiva de ejecución es de facto la misma que:

for (; count > 0; (void)++first, --count)
    ::new (static_cast<void*>(addressof(*first)))
        typename iterator_traits<ForwardIterator>::value_type();
return first;

Si se produce una excepción, los objetos construidos anteriormente se destruyen en un orden no especificado.

La versión con una directiva de ejecución tiene el mismo resultado, pero se ejecuta según el policy especificado.

Si se produce un error de asignación de memoria, se inicia una excepción std::bad_alloc.

Estas funciones son nuevas en C++17.

uses_allocator_v

Plantilla auxiliar de variable para acceder al valor de la plantilla uses_allocator.

template <class T, class Alloc>
inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;

Consulte también

<memory>