logo

Operatorji za novo in brisanje v C++ za dinamični pomnilnik

Dinamično dodeljevanje pomnilnika v C/C++ se nanaša na ročno dodeljevanje pomnilnika s strani programerja. Dinamično dodeljeni pomnilnik je dodeljen naprej kup, nestatičnim in lokalnim spremenljivkam pa se dodeli pomnilnik Stack (Nanašati se na Postavitev pomnilnika C Programi za podrobnosti).

Kaj so aplikacije?

  • Ena od uporab dinamično dodeljenega pomnilnika je dodeljevanje pomnilnika spremenljive velikosti, kar ni mogoče pri pomnilniku, dodeljenem prevajalniku, razen za nizi spremenljive dolžine .
  • Najpomembnejša uporaba je prilagodljivost, ki je zagotovljena programerjem. Pomnilnik lahko prosto dodeljujemo in sprostimo, kadar koli ga potrebujemo in kadar koli ga ne potrebujemo več. Obstaja veliko primerov, ko ta prilagodljivost pomaga. Primeri takih primerov so Drevo itd.

Kako se razlikuje od pomnilnika, dodeljenega običajnim spremenljivkam?



Za običajne spremenljivke, kot so int a, char str[10] itd., se pomnilnik samodejno dodeli in sprosti. Pri dinamično dodeljenem pomnilniku, kot je int *p = new int[10], je programerjeva odgovornost, da sprosti pomnilnik, ko ga ne potrebuje več. Če programer ne sprosti pomnilnika, povzroči a puščanje pomnilnika (pomnilnik se ne sprosti, dokler se program ne zaključi).

Kako se pomnilnik dodeljuje/sprosti v C++?
C uporablja malloc() in calloc() funkcija za dinamično dodeljevanje pomnilnika med izvajanjem in uporablja funkcijo free() za sprostitev dinamično dodeljenega pomnilnika. C++ podpira te funkcije in ima tudi dva operaterja novo in izbrisati, ki opravljajo nalogo dodeljevanja in sproščanja pomnilnika na boljši in lažji način.

nov operater

Novi operater označuje zahtevo za dodelitev pomnilnika v Free Store. Če je na voljo dovolj pomnilnika, novi operater inicializira pomnilnik in vrne naslov na novo dodeljenega in inicializiranega pomnilnika spremenljivki kazalca.

Sintaksa za uporabo novega operatorja

osnove selena
pointer-variable =   new   data-type;>

Tu je spremenljivka kazalca kazalec tipa data-type. Podatkovni tip je lahko kateri koli vgrajen podatkovni tip, vključno z nizom, ali kateri koli uporabniško določen podatkovni tip, vključno s strukturo in razredom.
primer:

// Pointer initialized with NULL // Then request memory for the variable int *p = NULL;  p = new int;    OR  // Combine declaration of pointer  // and their assignment int *p = new int;>
C++
// C++ program to demonstrate how to create dynamic variable // using new #include  #include  using namespace std; int main() {  // pointer to store the address returned by the new  int* ptr;  // allocating memory for integer  ptr = new int;  // assigning value using dereference operator  *ptr = 10;  // printing value and address  cout << 'Address: ' << ptr << endl;  cout << 'Value: ' << *ptr;  return 0; }>

Izhod
Address: 0x162bc20 Value: 10>

Inicializiraj pomnilnik: Pomnilnik za vgrajene tipe podatkov lahko inicializiramo tudi z uporabo novega operatorja. Za tipe podatkov po meri je potreben konstruktor (s tipom podatkov kot vhodom) za inicializacijo vrednosti. Tukaj je primer inicializacije obeh tipov podatkov:

pointer-variable =   new   data-type(value);>

primer:

C++
// C++ program to illustrate how to initialize a dynamic // variable with allocation #include  #include  using namespace std; // Custom data type with constructor to take initial value struct cust {  int p;  cust(int q)  : p(q)  {  }  cust() = default; }; int main() {  // creating inbuit data types with initial value  int* p = new int(25);  float* q = new float(75.25);  // Works fine, doesn’t require constructor  cust* var1 = new cust;  // OR  // Works fine, doesn’t require constructor  var1 = new cust();  // Notice error if you comment this line  cust* var = new cust(25);  cout << *p << ' ' << *q << ' ' << var->p;  vrni 0; }>

Izhod
25 75.25 25>

Dodelite blok pomnilnika: operator new se uporablja tudi za dodelitev bloka (matrike) pomnilnika tipa tip podatkov .

pointer-variable =   new   data-type[size];>

kjer velikost (spremenljivka) določa število elementov v matriki.

primer:

vrste strojnega učenja
int *p = new int[10]>

Dinamično dodeli pomnilnik za 10 neprekinjenih celih števil tipa int in vrne kazalec na prvi element zaporedja, ki mu je dodeljen vrh (kazalec). p[0] se nanaša na prvi element, p[1] se nanaša na drugi element in tako naprej.

dinamično dodeljevanje pomnilnika

Normalna matrična deklaracija v primerjavi z uporabo novega
Obstaja razlika med deklaracijo običajne matrike in dodeljevanjem bloka pomnilnika z uporabo new. Najpomembnejša razlika je v tem, da običajne matrike sprosti prevajalnik (če je matrika lokalna, se sprosti, ko se funkcija vrne ali dokonča). Vendar pa dinamično dodeljena polja vedno ostanejo tam, dokler jih programer ne sprosti ali pa se program ne zaključi.

Kaj pa, če med izvajanjem ni na voljo dovolj pomnilnika?
Če v kopici ni na voljo dovolj pomnilnika za dodelitev, nova zahteva nakaže napako tako, da vrže izjemo tipa std::bad_alloc, razen če se nothrow uporablja z operatorjem new, v tem primeru vrne kazalec NULL (pomaknite se do razdelka Izjema obravnava novega operaterja v to Članek). Zato je morda dobra ideja, da preverite spremenljivko kazalca, ki jo ustvari new, preden uporabite njegov program.

int *p = new(nothrow) int; if (!p) {  cout << 'Memory allocation failed
'; }>

brisanje operaterja

Ker je programerjeva odgovornost za sprostitev dinamično dodeljenega pomnilnika, je programerjem na voljo operator za brisanje v jeziku C++.

Sintaksa:

// Release memory pointed by pointer-variable   delete   pointer-variable;>

Tukaj je spremenljivka kazalca kazalec, ki kaže na podatkovni objekt, ki ga je ustvaril novo .

Primeri:

delete p; delete q;>

Če želite sprostiti dinamično dodeljeno matriko, na katero kaže spremenljivka kazalca, uporabite naslednjo obliko izbrisati :

  // Release block of memory     // pointed by pointer-variable  delete[] pointer-variable;     Example:    // It will free the entire array    // pointed by p.   delete[] p;>
CPP
// C++ program to illustrate dynamic allocation // and deallocation of memory using new and delete #include  using namespace std; int main() {  // Pointer initialization to null  int* p = NULL;  // Request memory for the variable  // using new operator  p = new (nothrow) int;  if (!p)  cout << 'allocation of memory failed
';  else {  // Store value at allocated address  *p = 29;  cout << 'Value of p: ' << *p << endl;  }  // Request block of memory  // using new operator  float* r = new float(75.25);  cout << 'Value of r: ' << *r << endl;  // Request block of memory of size n  int n = 5;  int* q = new (nothrow) int[n];  if (!q)  cout << 'allocation of memory failed
';  else {  for (int i = 0; i < n; i++)  q[i] = i + 1;  cout << 'Value store in block of memory: ';  for (int i = 0; i < n; i++)  cout << q[i] << ' ';  }  // freed the allocated memory  delete p;  delete r;  // freed the block of allocated memory  delete[] q;  return 0; }>

Izhod
Value of p: 29 Value of r: 75.25 Value store in block of memory: 1 2 3 4 5>

Časovna zapletenost: O(n), kjer je n podana velikost pomnilnika.

kako najti skrite stvari na androidu

Povezani članki:

  • Kviz o novem in brisanju
  • izbrisati vs brezplačno