2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Smart Pointer on C++:n työkalu, jota käytetään dynaamisesti varatun muistin automaattiseen hallintaan.
Se on luokka, joka kapseloi raakaosoittimien toiminnot ja pystyy automaattisesti käsittelemään resurssien allokoinnin ja vapauttamisen, mikä auttaa ohjelmoijia välttämään yleisiä muistinhallintavirheitä, kuten muistivuotoja, roikkuvia osoittimia ja muita ongelmia.
Älykkäät osoittimet toimivat Resource Acquisition Is Initialization (RAII) -mekanismin kautta, mikä tarkoittaa, että älykkäät osoittimet hankkivat resursseja, kun niitä rakennetaan, ja vapauttavat resursseja, kun ne tuhotaan. Näin varmistetaan, että resurssit vapautuvat oikein myös poikkeuksellisissa olosuhteissa.
(1) Muistivuoto: Muisti vapautetaan manuaalisesti, mutta se voidaan vapauttaa automaattisesti älykkäiden osoittimien avulla.
(2) Jaetun omistajuuden osoittimien levittäminen ja vapauttaminen, kuten tuhoutumisongelmat, kun useat säikeet käyttävät samaa objektia.
C++-standardikirjasto tarjoaa useita älykkäitä osoittimia, mukaan lukien:
std::unique_ptr
:
unique_ptr
Ilmentymällä on yksinomainen omistusoikeus objektiin, johon se osoittaa.unique_ptr
Kun se menee soveltamisalan ulkopuolelle tai nollataan nimenomaisesti, se kutsuu automaattisesti tuhoajan ja vapauttaa hallitun objektin.std::shared_ptr
:
shared_ptr
Instanssit jakavat omistusoikeuden samaan kohteeseen.shared_ptr
määrä.shared_ptr
Kun ilmentymä menee soveltamisalan ulkopuolelle tai nollataan, viitemäärä pienennetään nollaan, objektin tuhoaja kutsutaan ja objekti vapautetaan.std::weak_ptr
:
shared_ptr
pyöreä viiteongelma.shared_ptr
hallinnoitavia objekteja, mutta ei osallistu sen elinkaaren hallintaan.shared_ptr
Kun ilmentymä osoittaa objektiin,weak_ptr
Voi havaita, että esine on tuhoutunut.Älykkäiden osoittimien suunnittelu ja käyttö yksinkertaistaa huomattavasti C++:n muistinhallintaa ja parantaa ohjelman kestävyyttä ja turvallisuutta. Nykyaikaisessa C++-ohjelmoinnissa on erittäin suositeltavaa käyttää älykkäitä osoittimia raaka-osoittimien sijaan koodin laadun ja ylläpidettävyyden parantamiseksi.
Älykkäitä osoittimia käytetään C++:ssa keinona hallita automaattisesti dynaamisesti varattua muistia muistivuotojen ja muiden resurssienhallintaan liittyvien ongelmien estämiseksi.
std::unique_ptr
Esimerkkistd::unique_ptr
on älykäs osoitin, jolla on yksinoikeus ja joka varmistaa, että niitä on vain yksistd::unique_ptr
Ilmentymä hallitsee tiettyä resurssia.kunstd::unique_ptr
Kun se menee soveltamisalan ulkopuolelle tai nollataan, sen omistamat resurssit vapautetaan automaattisesti.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Esimerkkistd::shared_ptr
on jaetun omistuksen älykäs osoitin, joka mahdollistaa useitastd::shared_ptr
Instanssit jakavat saman resurssin omistuksen.std::shared_ptr
Käytä viitemäärää seurataksesi kuinka monta älykäs osoittimia osoittaa samaan resurssiin Kun viitemäärä saavuttaa nollan, resurssi vapautetaan.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
Käytössästd::shared_ptr
Kun teet tämän, ole varovainen välttääksesi pyöreitä viitetilanteita, jotka saavat viitemäärän koskaan putoamaan nollaan, mikä johtaa resurssivuotojin.Jos kyseessä on pyöreä viittaus, voit käyttäästd::weak_ptr
katkaista kierre,std::weak_ptr
Ei lisää viitemäärää, pitää vainstd::shared_ptr
Hallitse heikkoja viittauksia resursseihin.
Nämä esimerkit osoittavat, kuinka älykkäiden osoittimien avulla voidaan hallita dynaamisesti varattua muistia sen varmistamiseksi, että resurssit vapautetaan oikein oikeaan aikaan. Näin vältetään yleiset virheet, joita voi tapahtua muistin manuaalisessa hallinnassa.
https://www.cnblogs.com/god-of-death/p/17962676
https://zhuanlan.zhihu.com/p/678722914