<memory>
, funkcje
addressof
Pobiera prawdziwy adres obiektu.
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
Parametry
value
Obiekt lub funkcja, dla których ma być uzyskany prawdziwy adres.
Wartość zwracana
Rzeczywisty adres obiektu lub funkcji, do których value
odwołuje się obiekt , nawet jeśli istnieje przeciążony operator&()
.
Uwagi
align
Dopasowuje magazyn danego rozmiaru, wyrównany przez daną specyfikację wyrównania do pierwszego możliwego adresu danego magazynu.
void* align(
size_t alignment, // input
size_t size, // input
void*& ptr, // input/output
size_t& space // input/output
);
Parametry
alignment
Wyrównanie powiązane z próbą.
size
Rozmiar w bajtach dla wyrównanej pamięci.
ptr
Adres początkowy dostępnej puli ciągłej pamięci, która ma być użyta. Ten parametr jest również parametrem wyjściowym i jest ustawiony tak, aby zawierał nowy adres początkowy, jeśli wyrównanie zakończy się pomyślnie. Jeśli align()
ten parametr nie zostanie zmodyfikowany, ten parametr nie zostanie zmodyfikowany.
space
Łączna ilość dostępnego miejsca do align()
użycia podczas tworzenia wyrównanego magazynu. Ten parametr to również parametr wyjściowy, zawiera skorygowane miejsce pozostawione w buforze pamięci po odjęciu wyrównanej pamięci i wszystkich powiązanych obciążeń.
Jeśli align()
ten parametr nie zostanie zmodyfikowany, ten parametr nie zostanie zmodyfikowany.
Wartość zwracana
Wskaźnik NULL
, jeśli żądany bufor wyrównany nie mieści się w dostępnym miejscu; w przeciwnym razie nowa wartość ptr
.
Uwagi
Zmodyfikowane ptr
parametry i space
umożliwiają wielokrotne wywoływanie align()
w tym samym buforze, prawdopodobnie z różnymi wartościami dla alignment
i size
. Poniższy fragment kodu przedstawia jedno użycie elementu 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
shared_ptr
Tworzy obiekt do obiektów, które są przydzielane i konstruowane dla danego typu przy użyciu określonego alokatora. Zwraca wartość shared_ptr
.
template <class T, class Allocator, class... Args>
shared_ptr<T> allocate_shared(
Allocator alloc,
Args&&... args);
Parametry
alloc
Alokator używany do tworzenia obiektów.
args
Zero lub więcej argumentów, które stają się obiektami.
Uwagi
Funkcja tworzy obiekt shared_ptr<T>
, wskaźnik do T(args...)
wartości przydzielonej i skonstruowanej przez alloc
element .
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 rzutuje na 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;
Parametry
T
Typ kontrolowany przez zwrócony wskaźnik udostępniony.
Other
Typ kontrolowany przez wskaźnik współużytkowany argumentu.
sp
Wskaźnik współużytkowany argumentu.
Uwagi
Funkcja szablonu zwraca pusty shared_ptr
obiekt, jeśli const_cast<T*>(sp.get())
zwraca wskaźnik o wartości null. W przeciwnym razie zwraca obiekt, który jest właścicielem shared_ptr<T>
zasobu należącego do sp
elementu . Wyrażenie const_cast<T*>(sp.get())
musi być prawidłowe.
Przykład
// 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
Informuje moduł odśmiecanie pamięci, że znaki w bloku pamięci zdefiniowanym przez wskaźnik adresu podstawowego i rozmiar bloku nie zawierają żadnych wskaźników śledzenia.
void declare_no_pointers(
char* ptr,
size_t size);
Parametry
ptr
Adres pierwszego znaku, który nie zawiera już wskaźników do śledzenia.
size
Rozmiar bloku rozpoczynającego się od ptr
tego nie zawiera żadnych wskaźników śledzenia.
Uwagi
Funkcja informuje wszystkie moduły odśmiecające elementy odśmiecające, że adresy w zakresie [ptr, ptr + size)
nie zawierają już wskaźników śledzenia. (Wszelkie wskaźniki do przydzielonego magazynu nie mogą być wyłuszane, chyba że zostanie osiągnięty).
declare_reachable
Informuje moduł odśmiecania pamięci, że wskazany adres prowadzi do przydzielonej pamięci i jest osiągalny.
void declare_reachable(
void* ptr);
Parametry
ptr
Wskaźnik do osiągalnego, przydzielonego, prawidłowego obszaru magazynu.
Uwagi
Jeśli ptr
wartość nie ma wartości null, funkcja informuje o tym, że ptr
moduł odśmieceń pamięci jest teraz osiągalny, czyli wskazuje prawidłowy przydzielony magazyn.
default_delete
Usuwa obiekty przydzielone za pomocą polecenia operator new
. Nadaje się do użytku z unique_ptr
programem .
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;
};
Parametry
ptr
Wskaźnik do obiektu do usunięcia.
Other
Typ elementów w tablicy do usunięcia.
Uwagi
W szablonie klasy opisano usuwanie, które usuwa obiekty skalarne przydzielone za pomocą operator new
elementu , odpowiedniego do użycia z szablonem unique_ptr
klasy . Ma również jawną specjalizację default_delete<T[]>
.
destroy_at
template <class T>
void destroy_at(
T* location);
Tak samo jak location->~T()
.
destroy
template <class ForwardIterator>
void destroy(
ForwardIterator first,
ForwardIterator last);
Tak samo jak:
for (; first != last; ++first)
destroy_at(addressof(*first));
destroy_n
template <class ForwardIterator, class Size>
ForwardIterator destroy_n(
ForwardIterator first,
Size count);
Tak samo jak:
for (; count > 0; (void)++first, --count)
destroy_at(addressof(*first));
return first;
dynamic_pointer_cast
Rzutowanie dynamiczne na .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;
Parametry
T
Typ kontrolowany przez zwrócony wskaźnik udostępniony.
Other
Typ kontrolowany przez wskaźnik współużytkowany argumentu.
sp
Wskaźnik współużytkowany argumentu.
Uwagi
Funkcja szablonu zwraca pusty shared_ptr
obiekt, jeśli dynamic_cast<T*>(sp.get())
zwraca wskaźnik o wartości null. W przeciwnym razie zwraca obiekt, który jest właścicielem shared_ptr<T>
zasobu należącego do sp
elementu . Wyrażenie dynamic_cast<T*>(sp.get())
musi być prawidłowe.
Przykład
// 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
Pobierz program do usuwania z obiektu shared_ptr
.
template <class Deleter, class T>
Deleter* get_deleter(
const shared_ptr<T>& sp) noexcept;
Parametry
Deleter
Typ usuwania.
T
Typ kontrolowany przez wskaźnik udostępniony.
sp
Wskaźnik udostępniony.
Uwagi
Funkcja szablonu zwraca wskaźnik do usuwania typu Deleter
, który należy do shared_ptr
obiektu sp
. Jeśli sp
nie ma narzędzia do usuwania lub jeśli jego usuwanie nie jest typu Deleter
, funkcja zwraca wartość 0.
Przykład
// 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
Zwraca typ bezpieczeństwa wskaźnika założony przez dowolny moduł odśmiecania pamięci.
pointer_safety get_pointer_safety() noexcept;
Uwagi
Funkcja zwraca typ bezpieczeństwa wskaźnika zakładany przez każdy automatyczny moduł odśmiecający śmieci.
get_temporary_buffer
Przydziela magazyn tymczasowy dla sekwencji elementów, które nie przekraczają określonej liczby elementów.
template <class T>
pair<T *, ptrdiff_t> get_temporary_buffer(
ptrdiff_t count);
Parametry
count
Maksymalna liczba żądanych elementów, dla których ma zostać przydzielona pamięć.
Wartość zwracana
Którego pair
pierwszy składnik jest wskaźnikiem do pamięci, która została przydzielona, i którego drugi składnik daje rozmiar buforu, wskazując największą liczbę elementów, które może przechowywać.
Uwagi
Funkcja wysyła żądanie pamięci i może się nie powieść. Jeśli nie przydzielono buforu, funkcja zwraca parę, a drugi składnik jest równy zero i pierwszy składnik równy wskaźnikowi null.
Tej funkcji należy używać tylko w przypadku pamięci tymczasowej.
Przykład
// 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
Tworzy i zwraca element shared_ptr
wskazujący przydzielone obiekty, które są konstruowane z zero lub więcej argumentów przy użyciu domyślnego alokatora. Przydziela i konstruuje zarówno obiekt określonego typu, jak i obiekt shared_ptr
, aby zarządzać współdzieloną własnością obiektu, i zwraca obiekt shared_ptr
.
template <class T, class... Args>
shared_ptr<T> make_shared(
Args&&... args);
Parametry
args
Zero lub więcej argumentów konstruktora. Funkcja wywnioskuje, które przeciążenie konstruktora ma być wywoływane na podstawie podanych argumentów.
Uwagi
Użyj make_shared
jako prostego i bardziej wydajnego sposobu tworzenia obiektu i obiektu shared_ptr
w celu zarządzania dostępem udostępnionym do obiektu w tym samym czasie. Semantycznie te dwie instrukcje są równoważne:
auto sp = std::shared_ptr<Example>(new Example(argument));
auto msp = std::make_shared<Example>(argument);
Jednak pierwsza instrukcja wykonuje dwie alokacje, a jeśli alokacja shared_ptr
obiektu zakończy się niepowodzeniem po pomyślnym alokacji Example
obiektu, wyciek obiektu bez nazwy Example
. Instrukcja, która używa make_shared
, jest prostsza, ponieważ istnieje tylko jedno wywołanie funkcji. Jest to bardziej wydajne, ponieważ biblioteka może utworzyć pojedynczą alokację zarówno dla obiektu, jak i inteligentnego wskaźnika. Ta funkcja jest zarówno szybsza, jak i prowadzi do mniejszej fragmentacji pamięci, i nie ma szans na wyjątek w jednej alokacji, ale nie na drugą. Wydajność jest lepsza dzięki lepszej lokalizacji kodu, który odwołuje się do obiektu i aktualizuje liczbę odwołań w inteligentnym wskaźniku.
Rozważ użycie, make_unique
jeśli nie potrzebujesz dostępu współdzielonego do obiektu. Użyj allocate_shared
polecenia , jeśli musisz określić niestandardowy alokator dla obiektu. Nie można użyć make_shared
, jeśli obiekt wymaga niestandardowego usuwania, ponieważ nie ma możliwości przekazania usuwania jako argumentu.
W poniższym przykładzie pokazano, jak utworzyć udostępnione wskaźniki do typu przez wywołanie określonych przeciążeń konstruktora.
Przykład
// 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();
}
W przykładzie są generowane następujące dane wyjściowe:
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
Tworzy i zwraca obiekt unique_ptr
określonego typu, który jest konstruowany przy użyciu określonych argumentów.
// 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;
Parametry
T
Typ obiektu, na który unique_ptr
będzie wskazywać.
Args
Typy argumentów konstruktora określone przez args
.
args
Argumenty, które mają zostać przekazane do konstruktora obiektu typu T
.
elements
Tablica elementów typu T
.
size
Liczba elementów do przydzielenia miejsca w nowej tablicy.
Uwagi
Pierwsze przeciążenie jest używane dla pojedynczych obiektów. Drugie przeciążenie jest wywoływane dla tablic. Trzecie przeciążenie uniemożliwia określenie rozmiaru tablicy w argumencie typu (make_unique<T[N]>
); ta konstrukcja nie jest obsługiwana przez bieżący standard. Podczas make_unique
tworzenia unique_ptr
obiektu do tablicy należy zainicjować elementy tablicy oddzielnie. Zamiast używać tego przeciążenia, być może lepszym wyborem jest użycie elementu std::vector
.
Ze względu make_unique
na to, że w przypadku bezpieczeństwa wyjątków jest dokładnie zaimplementowana, zalecamy użycie make_unique
zamiast bezpośredniego wywoływania unique_ptr
konstruktorów.
Przykład
W poniższym przykładzie pokazano, jak używać polecenia make_unique
. Aby uzyskać więcej przykładów, zobacz How to: Create and Use unique_ptr Instances (Instrukcje: tworzenie i używanie wystąpień 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();
}
Po wyświetleniu błędu C2280 w połączeniu z elementem unique_ptr
, jest prawie na pewno, ponieważ próbujesz wywołać jego konstruktor kopiowania, który jest usuniętą funkcją.
owner_less
Pozwala na mieszane porównania oparte na własności współdzielonych i słabych wskaźników. Zwraca wartość true
, jeśli parametr po lewej stronie jest uporządkowany przed prawym parametrem przez funkcję owner_before
składową .
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;
};
Parametry
left
Współużytkowany lub słaby wskaźnik.
right
Współużytkowany lub słaby wskaźnik.
Uwagi
Szablony klas definiują wszystkie ich operatory składowe jako zwracane .left.owner_before(right)
reinterpret_pointer_cast
Tworzy nowy shared_ptr
wskaźnik z istniejącego współużytkowanego wskaźnika przy użyciu rzutu.
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;
Parametry
ptr
Odwołanie do elementu shared_ptr<U>
.
Uwagi
Jeśli wartość jest pusta, nowa shared_ptr
wartość jest również pusta. W ptr
przeciwnym razie współdzieli ona własność z elementem ptr
. Nowy wskaźnik udostępniony jest wynikiem oceny reinterpret_cast<Y*>(ptr.get())
wartości , gdzie Y
to typename std::shared_ptr<T>::element_type
. Zachowanie jest niezdefiniowane, jeśli reinterpret_cast<T*>((U*)nullptr)
nie jest poprawnie sformułowane.
Funkcja szablonu, która przyjmuje odwołanie lvalue, jest nowa w języku C++17. Funkcja szablonu, która przyjmuje odwołanie rvalue, jest nowa w języku C++20.
return_temporary_buffer
Cofa przydział pamięci tymczasowej przydzielonej przy użyciu funkcji szablonu get_temporary_buffer
.
template <class T>
void return_temporary_buffer(
T* buffer);
Parametry
buffer
Wskaźnik do pamięci, który ma zostać cofnięty.
Uwagi
Tej funkcji należy używać tylko w przypadku pamięci tymczasowej.
Przykład
// 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
Rzutowanie statyczne na 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;
Parametry
T
Typ kontrolowany przez zwrócony wskaźnik udostępniony.
Other
Typ kontrolowany przez wskaźnik współużytkowany argumentu.
sp
Wskaźnik współużytkowany argumentu.
Uwagi
Funkcja szablonu zwraca pusty shared_ptr
obiekt, jeśli sp
jest pustym shared_ptr
obiektem. W przeciwnym razie zwraca obiekt, który jest właścicielem shared_ptr<T>
zasobu należącego do sp
obiektu . Wyrażenie static_cast<T*>(sp.get())
musi być prawidłowe.
Przykład
// 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
Zamień dwa shared_ptr
obiekty , unique_ptr
lub 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;
Parametry
T
Typ kontrolowany przez wskaźnik argumentu.
Deleter
Usuwanie unikatowego typu wskaźnika.
left
Lewy wskaźnik.
right
Prawy wskaźnik.
Uwagi
Funkcje szablonu wywołają metodę left.swap(right)
.
Przykład
// 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
Informuje moduł odśmiecający pamięci, że znaki w bloku pamięci zdefiniowane przez wskaźnik adresu podstawowego i rozmiar bloku mogą teraz zawierać wskaźniki mogące podlegać śledzeniu.
void undeclare_no_pointers(
char* ptr,
size_t size);
Parametry
ptr
Wskaźnik do adresu pamięci wcześniej oznaczonego przy użyciu polecenia declare_no_pointers
.
size
Liczba bajtów w zakresie pamięci. Ta wartość musi być równa liczbie używanej w wywołaniu declare_no_pointers
.
Uwagi
Funkcja informuje wszelkie moduły odśmiecające elementy odśmiecające, że zakres adresów [ptr, ptr + size)
może teraz zawierać wskaźniki umożliwiające śledzenie.
undeclare_reachable
Odwołuje deklarację dostępności dla określonej lokalizacji pamięci.
template <class T>
T *undeclare_reachable(
T* ptr);
Parametry
ptr
Wskaźnik do adresu pamięci wcześniej oznaczonego przy użyciu polecenia declare_reachable
.
Uwagi
Jeśli ptr
nie nullptr
ma wartości , funkcja informuje o tym, że ptr
moduł odśmieceń pamięci nie jest już osiągalny. Zwraca bezpiecznie pochodny wskaźnik, który porównuje wartość równą ptr
.
uninitialized_copy
Kopiuje obiekty z określonego zakresu źródłowego do niezainicjowanego zakresu docelowego.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator danych wejściowych, odnoszący się do pierwszego elementu w zakresie źródłowym.
last
Iterator danych wejściowych, odnoszący się do ostatniego elementu w zakresie źródłowym.
dest
Iterator do przodu, który dotyczy pierwszego elementu w zakresie docelowym.
Wartość zwracana
Iterator do przodu odnoszący się do pierwszej pozycji poza zakresem docelowym, chyba że zakres źródłowy był pusty.
Uwagi
Ten algorytm umożliwia oddzielenie alokacji pamięci od konstrukcji obiektu.
Funkcja szablonu skutecznie wykonuje:
while (first != last)
{
new (static_cast<void*>(&* dest++))
typename iterator_traits<InputIterator>::value_type(*first++);
}
return dest;
chyba że kod zgłasza wyjątek. W takim przypadku wszystkie skonstruowane obiekty są niszczone, a wyjątek jest zgłaszany ponownie.
Przeciążenie zasad wykonywania jest nowe w języku C++17.
Przykład
// 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
Tworzy kopię określonej liczby elementów z iteratora danych wejściowych. Kopie są wprowadzane do iteratora do przodu.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator danych wejściowych, który odwołuje się do obiektu do skopiowania.
count
Typ całkowitoliczbowy ze znakiem lub bez znaku, określający, ile razy obiekt ma być skopiowany.
dest
Iterator do przodu odwołujący się do lokalizacji nowych kopii.
Wartość zwracana
Iterator do przodu, który odnosi się do pierwszej pozycji poza miejscem docelowym. Jeśli zakres źródłowy był pusty, iterator adresuje first
wartość .
Uwagi
Funkcja szablonu skutecznie wykonuje następujący kod:
for (; 0 < count; --count)
new (static_cast<void*>(&* dest++))
typename iterator_traits<InputIterator>::value_type(*first++);
return dest;
chyba że kod zgłasza wyjątek. W takim przypadku wszystkie skonstruowane obiekty są niszczone, a wyjątek jest zgłaszany ponownie.
Przeciążenie zasad wykonywania jest nowe w języku C++17.
uninitialized_default_construct
Domyślne konstrukcje obiektów iteratorów value_type
w określonym zakresie.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator odnoszący się do pierwszego elementu w zakresie do konstruowania.
last
Iterator odnoszący się do jednego ostatniego elementu w zakresie do konstruowania.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
for (; first != last; ++first)
::new (static_cast<void*>(addressof(*first)))
typename iterator_traits<ForwardIterator>::value_type;
Jeśli zgłaszany jest wyjątek, wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Te funkcje są nowe w języku C++17.
uninitialized_default_construct_n
Ustawienie domyślne tworzy określoną liczbę obiektów iteratora value_type
, zaczynając od określonej lokalizacji.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator odnoszący się do pierwszego elementu w zakresie docelowym do skonstruowania.
count
Liczba elementów w zakresie docelowym do konstruowania.
Wartość zwracana
Iterator do przodu odnoszący się do pierwszej pozycji poza zakresem docelowym, chyba że zakres źródłowy był pusty.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
for (; count>0; (void)++first, --count)
::new (static_cast<void*>(addressof(*first)))
typename iterator_traits<ForwardIterator>::value_type;
return first;
Jeśli zgłaszany jest wyjątek, wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Te funkcje są nowe w języku C++17.
uninitialized_fill
Kopiuje obiekty z określoną wartością do niezainicjowanego zakresu docelowego.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator do przodu odnoszący się do pierwszego elementu w zakresie docelowym w celu zainicjowania.
last
Iterator do przodu odnoszący się do ostatniego elementu w zakresie docelowym w celu zainicjowania.
value
Wartość wykorzystana do zainicjowania zakresu docelowego.
Uwagi
Ten algorytm umożliwia oddzielenie alokacji pamięci od konstrukcji obiektu.
Funkcja szablonu skutecznie wykonuje:
while (first != last)
new (static_cast<void*>(&* first ++))
typename iterator_traits<ForwardIterator>::value_type (value);
chyba że kod zgłasza wyjątek. W takim przypadku wszystkie skonstruowane obiekty są niszczone, a wyjątek jest zgłaszany ponownie.
Przeciążenie zasad wykonywania jest nowe w języku C++17.
Przykład
// 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
Kopiuje obiekty określonej wartości do określonej liczby elementów niezainicjowanego zakresu docelowego.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator do przodu odnoszący się do pierwszego elementu w zakresie docelowym w celu zainicjowania.
count
Liczba elementów do zainicjowania.
value
Wartość używana do inicjowania zakresu docelowego.
Uwagi
Ten algorytm umożliwia oddzielenie alokacji pamięci od konstrukcji obiektu.
Funkcja szablonu skutecznie wykonuje:
while (0 < count--)
new (static_cast<void*>(&* first++))
typename iterator_traits<ForwardIterator>::value_type(value);
return first;
chyba że kod zgłasza wyjątek. W takim przypadku wszystkie skonstruowane obiekty są niszczone, a wyjątek jest zgłaszany ponownie.
Przeciążenie zasad wykonywania jest nowe w języku C++17.
Przykład
// 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
Przenosi elementy z zakresu źródłowego do niezainicjowanego obszaru pamięci docelowej.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator wejściowy odnoszący się do pierwszego elementu w zakresie źródłowym do przeniesienia.
last
Iterator wejściowy odnoszący się do jednego ostatniego elementu w zakresie źródłowym do przeniesienia.
dest
Początek zakresu docelowego.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
for (; first != last; (void)++dest, ++first)
::new (static_cast<void*>(addressof(*dest)))
typename iterator_traits<ForwardIterator>::value_type(std::move(*first));
return dest;
Jeśli zostanie zgłoszony wyjątek, niektóre obiekty w zakresie źródłowym mogą pozostać w prawidłowym, ale nieokreślonym stanie. Wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Te funkcje są nowe w języku C++17.
uninitialized_move_n
Przenosi określoną liczbę elementów z zakresu źródłowego do niezainicjowanego obszaru pamięci docelowej.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator wejściowy odnoszący się do pierwszego elementu w zakresie źródłowym do przeniesienia.
count
Liczba elementów w zakresie źródłowym do przeniesienia.
dest
Początek zakresu docelowego.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
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};
Jeśli zostanie zgłoszony wyjątek, niektóre obiekty w zakresie źródłowym mogą pozostać w prawidłowym, ale nieokreślonym stanie. Wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Te funkcje są nowe w języku C++17.
uninitialized_value_construct
Tworzy obiekty iteratorów value_type
według inicjowania wartości w określonym zakresie.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator odnoszący się do pierwszego elementu w zakresie do konstrukcji wartości.
last
Iterator odnoszący się do jednego ostatniego elementu w zakresie do konstrukcji wartości.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
for (; first != last; ++first)
::new (static_cast<void*>(addressof(*first)))
typename iterator_traits<ForwardIterator>::value_type();
Jeśli zgłaszany jest wyjątek, wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Jeśli wystąpi błąd alokacji pamięci, std::bad_alloc
zostanie zgłoszony wyjątek.
Te funkcje są nowe w języku C++17.
uninitialized_value_construct_n
Tworzy określoną liczbę obiektów iteratora value_type
według inicjowania wartości, zaczynając od określonej lokalizacji.
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);
Parametry
policy
Zasady wykonywania do użycia.
first
Iterator odnoszący się do pierwszego elementu w zakresie docelowym do skonstruowania.
count
Liczba elementów w zakresie docelowym do konstruowania.
Uwagi
Wersja bez zasad wykonywania jest w rzeczywistości taka sama jak:
for (; count > 0; (void)++first, --count)
::new (static_cast<void*>(addressof(*first)))
typename iterator_traits<ForwardIterator>::value_type();
return first;
Jeśli zgłaszany jest wyjątek, wcześniej skonstruowane obiekty są niszczone w nieokreślonej kolejności.
Wersja z zasadami wykonywania ma ten sam wynik, ale jest wykonywana zgodnie z określonym policy
elementem .
Jeśli wystąpi błąd alokacji pamięci, std::bad_alloc
zostanie zgłoszony wyjątek.
Te funkcje są nowe w języku C++17.
uses_allocator_v
Szablon zmiennej pomocniczej umożliwiający uzyskanie dostępu do wartości szablonu uses_allocator
.
template <class T, class Alloc>
inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;