Auto_ptr - auto_ptr - Wikipedia
auto_ptr je třída šablona který byl k dispozici v předchozích verzích C ++ standardní knihovna (deklarováno v <memory>
hlavičkový soubor ), který poskytuje některé základní RAII funkce pro C ++ surové ukazatele. To bylo nahrazeno unique_ptr třída.
The auto_ptr
Třída šablony popisuje objekt, který ukládá ukazatel na jediný přidělený objekt, který zajišťuje, že objekt, na který ukazuje, se automaticky zničí, když ovládací prvek opustí obor.[1]
The C ++ 11 standard vyroben auto_ptr
zastaralé a nahrazeno unique_ptr
šablona třídy.[2][3] auto_ptr
byl úplně odstraněn v C ++ 17.[4]U sdíleného vlastnictví shared_ptr
lze použít třídu šablony. shared_ptr
byl definován v C ++ 11 a je k dispozici také v Zvyšte knihovnu pro použití s předchozími verzemi C ++.[5]
Prohlášení
The auto_ptr
třída je deklarována v ISO / IEC 14882, oddíl 20.4.5 jako:
jmenný prostor std { šablona <třída Y> struktur auto_ptr_ref {}; šablona <třída X> třída auto_ptr { veřejnost: typedef X typ_typu; // 20.4.5.1 konstrukce / kopírování / zničení: explicitní auto_ptr(X* str =0) házet(); auto_ptr(auto_ptr&) házet(); šablona <třída Y> auto_ptr(auto_ptr<Y>&) házet(); auto_ptr& operátor=(auto_ptr&) házet(); šablona <třída Y> auto_ptr& operátor=(auto_ptr<Y>&) házet(); auto_ptr& operátor=(auto_ptr_ref<X>) házet(); ~auto_ptr() házet(); // 20.4.5.2 členové: X& operátor*() konst házet(); X* operátor->() konst házet(); X* dostat() konst házet(); X* uvolnění() házet(); prázdnota resetovat(X* str =0) házet(); // 20.4.5.3 převody: auto_ptr(auto_ptr_ref<X>) házet(); šablona <třída Y> operátor auto_ptr_ref<Y>() házet(); šablona <třída Y> operátor auto_ptr<Y>() házet(); };}
Sémantika
The auto_ptr
má sémantiku přísného vlastnictví, což znamená, že auto_ptr
instance je jedinou entitou odpovědnou za životnost objektu. Pokud auto_ptr
je zkopírován, zdroj ztratí referenci. Například:
#zahrnout <iostream>#zahrnout <memory>použitím jmenný prostor std; int hlavní(int argc, char **argv){ int *i = Nový int; auto_ptr<int> X(i); auto_ptr<int> y; y = X; cout << X.dostat() << konec; // Tisk NULL cout << y.dostat() << konec; // Tisk jiné než NULL adresy i vrátit se 0;}
Tento kód vytiskne a NULA adresa pro první auto_ptr
objekt a nějakou jinou než NULL adresu pro druhý, což ukazuje, že zdrojový objekt ztratil během přiřazení odkaz (=
). Surový ukazatel i
v příkladu by neměl být odstraněn, protože bude odstraněn pomocí auto_ptr
který vlastní referenci. Ve skutečnosti, nová int
mohl být předán přímo do X
, což eliminuje potřebu i
.
Všimněte si, že objekt ukázal pomocí auto_ptr
je zničen pomocí operátor mazat
; to znamená, že byste měli používat pouze auto_ptr
pro ukazatele získané pomocí operátor nový
. To vylučuje ukazatele vrácené uživatelem malloc / calloc / realloc
, a ukazatele na pole (protože pole jsou přidělena pomocí operátor Nový[]
a musí být uvolněno uživatelem operátor mazat []
).
Díky své sémantice kopírování auto_ptr
nemusí být použito v kontejnerech STL, které mohou ve svých operacích provádět kopie prvků.
Viz také
Reference
- ^ "třída auto_ptr". Microsoft. Citováno 2006-09-27.
- ^ „Pracovní koncept, standard pro programovací jazyk C ++ N3242“ (PDF). 28. února 2011. str. 1233. Citováno 2013-02-17.
- ^ Kalev, Danny. „Using unique_ptr, Part I“. informIT. Citováno 30. září 2010.
- ^ „Programovací jazyk C ++, pracovní skupina Evolution Library JTC1 / SC22 / WG21 N4190“. 2014-10-09. Citováno 2016-08-29.
- ^ „Shromažďování sdílených objektů“. Dr. Dobb. 01.07.2004. Citováno 2006-09-27.
externí odkazy
- Použitím
auto_ptr
účinně - Vyhněte se únikům paměti pomocí
auto_ptr
- Článek "Za použití
auto_ptr
Šablona třídy pro usnadnění dynamické správy paměti "od Danny Kalev - Článek "Kontejner
auto_ptr
"od Zeeshan Amjad - Článek "Aktualizace zapnuta
auto_ptr
"od Scott Meyers auto_ptr
Odkaz na šablonu třídy z GNU libstdc ++auto_ptr
odkaz od Rogue Wave