Nou (C++)

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 11 ianuarie 2014; verificările necesită 24 de modificări .

new este un operator de limbaj de programare C++ care oferă alocarea dinamică a memoriei pe heap . Cu excepția unui formular numit „ formular de alocare nou ”, newîncearcă să aloce suficientă memorie pe heap pentru a găzdui noile date și, dacă reușește, returnează adresa locației de memorie alocată. Cu toate acestea, dacă newnu poate aloca memorie pe heap, atunci va arunca o excepție de tip std::bad_alloc. Acest lucru elimină necesitatea de a verifica în mod explicit rezultatul selecției. După ce compilatorul întâlnește cuvântul cheie, newgenerează un apel către constructorul de clasă [1] .

Sintaxă

Sintaxa newarată astfel:

p_var = nume de tip nou ;

unde este indicatorul de tip p_var declarat anterior . poate însemna orice tip de date fundamental sau obiect definit de utilizator (inclusiv , și ) . Dacă  este o clasă sau un tip de structură, atunci trebuie să aibă un constructor implicit disponibil care va fi apelat pentru a crea obiectul. typenametypenameenumclassstructtypename

Pentru a inițializa o nouă variabilă creată cu new, utilizați următoarea sintaxă:

p_var = tip nou ( initializer );

unde initializer este valoarea inițială atribuită noii variabile și dacă type este tipul clasei, atunci initializer sunt argumentele constructorului.

newpoate crea și o matrice :

p_var = tip nou [ dimensiune ] ;

În acest caz, sizespecifică dimensiunea (lungimea) matricei unidimensionale create. Adresa primului element este returnată și plasată în p_var, deci

p_var [ n ]

înseamnă valoarea celui de n-al-lea element (numărând de la poziția zero)

Memoria alocată cu newtrebuie eliberată cu pentru a deleteevita o scurgere de memorie . Matricele alocate (create) cu new[], trebuie eliberate (distruse) cu delete[].

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

Inițializatoarele nu pot fi specificate pentru matricele create cu new. Toate elementele matricei sunt inițializate folosind constructorul implicit pentru tipul dat. Dacă tipul nu are un constructor implicit, zona de memorie alocată nu va fi inițializată.

Plasare nouă

Există o formă specială a noului operator numită Placement new. Acest operator nu alocă memorie, ci ia drept argument o adresă memoriei deja alocată într-un fel (de exemplu, pe stivă sau prin malloc ()). Obiectul este alocat (inițializat) prin apelarea constructorului, iar obiectul este creat în memorie la adresa specificată. Adesea, această metodă este folosită atunci când clasa nu are un constructor implicit și trebuie să creați o matrice de obiecte. Un exemplu de apel arată astfel:

#include <new> // Necesar pentru a utiliza destinația de plasare nouă clasa A { public : A ( int x ){} ~ A (){} }; const int n = 50 ; A * placementMemory = static_cast < A *> ( operator new [] ( n * sizeof ( A ))); pentru ( int i = 0 ; i < n ; i ++ ) { new ( placementMemory + i ) A ( rand ()); //aici memoria pentru obiect nu este alocata, ci este initializata } //!!deinițializarea memoriei pentru ( int i = 0 ; i < n ; i ++ ) { placementMemory [ i ]. ~ A (); } operator delete [] ( placementMemory );

Deoarece tipul obiectului (obiectelor) creat(e) nu a fost specificat când memoria a fost alocată, compilatorul nu va apela destructorul pentru fiecare obiect matrice, deci acest lucru trebuie făcut manual înainte de a elibera blocul de memorie.

Implementare

În compilatoarele care aderă la standardul ISO C++ , dacă nu există suficientă memorie de alocat, atunci o excepție de tip std::bad_alloc. Execuția tuturor codurilor ulterioare se oprește până când eroarea este tratată într-un bloc try-catch sau programul se termină anormal. Programul nu trebuie să verifice valoarea indicatorului; dacă nu s-a făcut nicio excepție, atunci alocarea a avut succes. Operațiunile implementate sunt definite în antet <new>. În majoritatea implementărilor C++, operatorul newpoate fi, de asemenea, supraîncărcat pentru a defini un comportament special.

Eliberarea memoriei alocate dinamic

Orice memorie dinamică alocată cu new, trebuie eliberată cu delete. Există două opțiuni: una pentru matrice, cealaltă pentru obiecte individuale.

int * p_var = new int ; int * p_array = new int [ 50 ]; șterge p_var ; delete [] p_array ;

Standardul nu cere compilatorului să genereze un mesaj de diagnostic atunci când este utilizat incorect delete; în general, nu poate ști când un pointer indică către un singur element și când indică către o serie de elemente. Mai mult, folosirea unei ediții inadecvate este un comportament nedefinit .

Realocarea memoriei alocate cu new[]

Spre deosebire de o funcție reallocdin C , un operator new[]nu poate realoca direct memoria deja alocată. Pentru a crește sau a micșora dimensiunea unui bloc de memorie, trebuie să alocați un nou bloc de dimensiunea dorită, să copiați datele din memoria veche și să ștergeți blocul vechi. Biblioteca standard C++ oferă suport pentru o matrice dinamică care poate fi incrementată sau decrementată în clasa sa de șablon std::vector.

Vezi și

Link -uri

Note

  1. Știm totul despre operatorii noi și de ștergere? (link indisponibil) . Preluat la 9 iulie 2013. Arhivat din original la 14 iulie 2013.