Uusi (C++)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 11. tammikuuta 2014 tarkistetusta versiosta . tarkastukset vaativat 24 muokkausta .

new on C++- ohjelmointikielen operaattori , joka tarjoaa dynaamisen muistin varauksen kasaan . Lukuun ottamatta lomaketta nimeltä " allokaatiolomake uusi ", yrittää varata kasaan tarpeeksi muistia uusien tietojen vastaanottamiseksi ja, jos onnistuu, palauttaa varatun muistipaikan osoitteen. Jos se ei kuitenkaan voi varata muistia kasaan, se heittää tyypin poikkeuksen . Tämä eliminoi tarpeen tarkastaa valintatulosta. Kun kääntäjä kohtaa avainsanan, se luo kutsun luokan rakentajalle [1] . newnewstd::bad_allocnew

Syntaksi

Syntaksi newnäyttää tältä:

p_var = uusi tyyppinimi ;

missä on p_var aiemmin ilmoitettu tyyppiosoitintypename . typenamevoi tarkoittaa mitä tahansa perustietotyyppiä tai käyttäjän määrittämää objektia (mukaan lukien , enum, classja struct). Jos typename on luokka- tai rakennetyyppi, sillä on oltava käytettävissä oletuskonstruktori , jota kutsutaan luomaan objekti.

Jos haluat alustaa uuden muuttujan, joka on luotu newkäyttämällä seuraavaa syntaksia:

p_var = uusi tyyppi ( alustaja );

missä initializer on uudelle muuttujalle annettu alkuarvo, ja jos type on luokan tyyppi, niin initializer ovat rakentajan argumentti(t).

newvoi myös luoda taulukon :

p_var = uusi tyyppi [ koko ] ;

Tässä tapauksessa sizemäärittää luodun yksiulotteisen taulukon ulottuvuuden (pituuden). Ensimmäisen elementin osoite palautetaan ja sijoitetaan kohtaan p_var, joten

p_var [ n ]

tarkoittaa -:nnen elementin arvoa n(laskettuna paikasta nolla)

Kohdalla varattu muisti newon vapautettava muistivuodondelete välttämiseksi . Matriisit, jotka on allokoitu (luotu) , on vapautettava (tuhottava) . new[]delete[]

int * p_scalar = uusi int ( 5 ); int * p_array = uusi int [ 5 ];

Alusteita ei voi määrittää taulukoille, jotka on luotu käyttämällä new. Kaikki taulukon elementit alustetaan tietyn tyypin oletuskonstruktorilla. Jos tyypillä ei ole oletuskonstruktoria, varattua muistialuetta ei alusteta.

Sijoitus uusi

Uudesta operaattorista on olemassa erityinen muoto nimeltä Placement new. Tämä operaattori ei varaa muistia, vaan ottaa argumentiksi osoitteen muistiin, joka on jo varattu jollain tavalla (esimerkiksi pinossa tai mallocin () kautta). Kohde allokoidaan (alustetaan) kutsumalla konstruktoria ja objekti luodaan muistiin määritettyyn osoitteeseen. Usein tätä menetelmää käytetään, kun luokalla ei ole oletuskonstruktoria ja sinun on luotava joukko objekteja. Esimerkkipuhelu näyttää tältä:

#include <new> // Pakollinen sijoittelun käyttämiseen new luokka A { julkinen : A ( int x ){} ~ A (){} }; const int n = 50 ; A * sijoitusMuisti = static_cast < A *> ( operaattori uusi [] ( n * koko ( A ))); for ( int i = 0 ; i < n ; i ++ ) { uusi ( sijoitusMuisti + i ) A ( rand ()); //tässä objektin muistia ei varata, vaan se alustetaan } //!!muistin deinitialisointi kohteelle ( int i = 0 ; i < n ; i ++ ) { sijoitusmuisti [ i ]. ~ A (); } operaattorin poistaminen [] ( placementMemory );

Koska luotavien objektien tyyppiä ei määritetty muistia varattaessa, kääntäjä ei kutsu kunkin taulukkoobjektin destruktoria, joten tämä on tehtävä manuaalisesti ennen muistilohkon vapauttamista.

Toteutus

Kääntäjässä , joka noudattaa ISO C++ -standardia , jos muistia ei ole tarpeeksi varattava, poikkeuksena tyyppi . Kaikkien myöhempien koodien suorittaminen pysähtyy, kunnes virhe käsitellään try-catch-lohkossa tai ohjelma päättyy epänormaalisti. Ohjelman ei tarvitse tarkistaa osoittimen arvoa; jos poikkeusta ei tehty, kohdentaminen onnistui. Toteutetut toiminnot määritellään otsikossa . Useimmissa C++-toteutuksissa operaattori voidaan myös ylikuormittaa erityiskäyttäytymisen määrittelemiseksi. std::bad_alloc<new>new

Vapautetaan dynaamisesti varattu muisti

Kaikki dynaamiset muistit , joihin on varattu new, on vapautettava komennolla delete. Vaihtoehtoja on kaksi: yksi taulukoille, toinen yksittäisille objekteille.

int * p_var = uusi int ; int * p_array = uusi int [ 50 ]; poista p_var ; poista [] p_array ;

Standardi ei vaadi kääntäjää luomaan diagnostiikkasanomaa, jos sitä käytetään väärin delete. se ei yleensä voi tietää, milloin osoitin osoittaa yhteen elementtiin ja milloin se osoittaa elementtijoukkoa. Lisäksi sopimattoman julkaisun käyttö on määrittelemätöntä toimintaa .

Varataan uudelleen new[]

Toisin kuin Crealloc :n funktio , operaattori ei voi suoraan allokoida uudelleen jo varattua muistia. Muistilohkon koon suurentamiseksi tai pienentämiseksi sinun on varattava uusi haluamasi kokoinen lohko, kopioitava tiedot vanhasta muistista ja poistettava vanha lohko. C++-standardikirjasto tukee dynaamista taulukkoa , jota voidaan kasvattaa tai pienentää sen malliluokassa . new[]std::vector

Katso myös

Linkit

Muistiinpanot

  1. Tiedämmekö kaiken uusista ja poistetuista operaattoreista? (linkki ei saatavilla) . Haettu 9. heinäkuuta 2013. Arkistoitu alkuperäisestä 14. heinäkuuta 2013.