Teknologian jakaminen

【C】Älykäs osoitin

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Älykkäät osoittimet selitetty

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.

 

Ongelmia ratkaistu älykkäillä osoittimilla

(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.

 

Useita älykkäitä osoittimia

C++-standardikirjasto tarjoaa useita älykkäitä osoittimia, mukaan lukien:

  1. std::unique_ptr

    • yksinomaisen omistusmallin, joka tarkoittaa aunique_ptrIlmentymällä on yksinomainen omistusoikeus objektiin, johon se osoittaa.
    • kununique_ptrKun se menee soveltamisalan ulkopuolelle tai nollataan nimenomaisesti, se kutsuu automaattisesti tuhoajan ja vapauttaa hallitun objektin.
    • Kopiointia ei tueta, mutta siirtäminen on mahdollista.
  2. std::shared_ptr

    • Jaettu omistusmalli, joka sallii useitashared_ptrInstanssit jakavat omistusoikeuden samaan kohteeseen.
    • Käytä viitteiden laskentaa seurataksesi viittauksia samaan kohteeseenshared_ptrmäärä.
    • kun viimeinenshared_ptrKun ilmentymä menee soveltamisalan ulkopuolelle tai nollataan, viitemäärä pienennetään nollaan, objektin tuhoaja kutsutaan ja objekti vapautetaan.
  3. std::weak_ptr

    • käytetään ratkaisemaanshared_ptrpyöreä viiteongelma.
    • Lisäämättä viitemäärää, se voidaan havaitashared_ptrhallinnoitavia objekteja, mutta ei osallistu sen elinkaaren hallintaan.
    • Kun ei oleshared_ptrKun ilmentymä osoittaa objektiin,weak_ptrVoi 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.

 

Esimerkki älykkäästä osoittimesta

Älykkäitä osoittimia käytetään C++:ssa keinona hallita automaattisesti dynaamisesti varattua muistia muistivuotojen ja muiden resurssienhallintaan liittyvien ongelmien estämiseksi.

std::unique_ptrEsimerkki

std::unique_ptron älykäs osoitin, jolla on yksinoikeus ja joka varmistaa, että niitä on vain yksistd::unique_ptr Ilmentymä hallitsee tiettyä resurssia.kunstd::unique_ptrKun se menee soveltamisalan ulkopuolelle tai nollataan, sen omistamat resurssit vapautetaan automaattisesti.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个unique_ptr来管理MyClass的实例
  10. std::unique_ptr<MyClass> uptr(new MyClass());
  11. // 调用doSomething方法
  12. uptr->doSomething();
  13. // unique_ptr会在离开作用域时自动调用MyClass的析构函数
  14. return 0;
  15. }

std::shared_ptrEsimerkki

std::shared_ptron jaetun omistuksen älykäs osoitin, joka mahdollistaa useitastd::shared_ptrInstanssit jakavat saman resurssin omistuksen.std::shared_ptrKäytä viitemäärää seurataksesi kuinka monta älykäs osoittimia osoittaa samaan resurssiin Kun viitemäärä saavuttaa nollan, resurssi vapautetaan.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个shared_ptr来管理MyClass的实例
  10. std::shared_ptr<MyClass> sptr(new MyClass());
  11. // 创建第二个shared_ptr,共享同一个MyClass实例
  12. std::shared_ptr<MyClass> sptr2 = sptr;
  13. // 调用doSomething方法
  14. sptr->doSomething();
  15. // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
  16. return 0;
  17. }

 

Varotoimenpiteet

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_ptrkatkaista kierre,std::weak_ptrEi lisää viitemäärää, pitää vainstd::shared_ptrHallitse 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.

 

Muita esimerkkejä

https://www.cnblogs.com/god-of-death/p/17962676

https://zhuanlan.zhihu.com/p/678722914