Ny (C++)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 11 januari 2014; kontroller kräver 24 redigeringar .

new är en C++ programmeringsspråksoperatör som tillhandahåller dynamisk minnesallokeringheapen . Med undantag för ett formulär som kallas " tilldelningsformulär ny ", försöker allokera tillräckligt med minne på högen för att rymma den nya datan och, om den lyckas, returnerar adressen till den tilldelade minnesplatsen. Men om den inte kan allokera minne på högen, kommer den att kasta ett undantag av typen . Detta eliminerar behovet av att explicit kontrollera urvalsresultatet. Efter att kompilatorn stöter på nyckelordet genererar den ett anrop till klasskonstruktorn [1] . newnewstd::bad_allocnew

Syntax

Syntaxen newser ut så här:

p_var = nytt typnamn ;

var är p_var den tidigare deklarerade typpekarentypename . typenamekan betyda vilken grundläggande datatyp eller användardefinierat objekt som helst (inklusive , enum, classoch struct). Om typename är en klass eller strukturtyp måste den ha en tillgänglig standardkonstruktor som kommer att anropas för att skapa objektet.

För att initiera en ny variabel skapad med new, använd följande syntax:

p_var = ny typ ( initierare );

var initializer är det initiala värdet som tilldelas den nya variabeln, och om type är klassens typ, då initializer är konstruktorns argument.

newkan också skapa en array :

p_var = nytyp [ storlek ] ;

Anger i det här fallet sizedimensionen (längden) för den skapade endimensionella arrayen. Adressen för det första elementet returneras och placeras i p_var, so

p_var [ n ]

betyder värdet av det n-th elementet (räknat från position noll)

Minne tilldelat med newmåste frigöras med för att deleteundvika en minnesläcka . Arrayer tilldelade (skapade) med new[], måste frigöras (förstöras) med delete[].

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

Initialiserare kan inte anges för arrayer skapade med new. Alla arrayelement initieras med standardkonstruktorn för den givna typen. Om typen inte har en standardkonstruktor kommer det tilldelade minnesområdet inte att initieras.

Placering ny

Det finns en speciell form av den nya operatören som heter Placering ny. Denna operatör allokerar inte minne, utan tar som argument en adress till minnet som redan är allokerat på något sätt (till exempel på stacken eller genom malloc ()). Objektet allokeras (initieras) genom att anropa konstruktorn, och objektet skapas i minnet på den angivna adressen. Ofta används den här metoden när klassen inte har en standardkonstruktor och du behöver skapa en array av objekt. Ett exempelsamtal ser ut så här:

#include <new> // Krävs för att använda ny placering klass A { offentliga : A ( int x ){} ~ A (){} }; const int n = 50 ; A * placementMemory = static_cast < A *> ( operator new [] ( n * sizeof ( A ))); för ( int i = 0 ; i < n ; i ++ ) { new ( placementMemory + i ) A ( rand ()); //här är inte minnet för objektet allokerat, utan initieras } //!!minnesavinitialisering för ( int i = 0 ; i < n ; i ++ ) { placeringMinne [ i ]. ~ A (); } operator radera [] ( placementMemory );

Eftersom typen av objekt/objekt som skapas inte specificerades när minnet tilldelades, kommer kompilatorn inte att anropa destruktorn för varje arrayobjekt, så detta måste göras manuellt innan minnesblocket frigörs.

Implementering

I kompilatorer som följer ISO C++-standarden , om det inte finns tillräckligt med minne för att allokera, då ett undantag av typen std::bad_alloc. Exekveringen av all efterföljande kod stoppar tills felet hanteras i ett försöksfångstblock eller programmet avslutas onormalt. Programmet behöver inte kontrollera värdet på pekaren; om inget undantag gjordes, var tilldelningen framgångsrik. Implementerade operationer definieras i rubriken <new>. I de flesta C++-implementeringar kan operatören newockså överbelastas för att definiera speciellt beteende.

Frigör dynamiskt allokerat minne

Alla dynamiska minne som tilldelats med newmåste frigöras med delete. Det finns två alternativ: ett för arrayer, det andra för enstaka objekt.

int * p_var = ny int ; int * p_array = new int [ 50 ]; ta bort p_var ; ta bort [] p_array ;

Standarden kräver inte att kompilatorn genererar ett diagnostiskt meddelande när den används felaktigt delete; den kan i allmänhet inte veta när en pekare pekar på ett enskilt element och när den pekar på en array av element. Att använda en olämplig version är dessutom odefinierat beteende .

Omallokering av minne tilldelat med new[]

Till skillnad från en funktion realloci C kan en operatör new[]inte direkt omfördela redan tilldelat minne. För att öka eller minska storleken på ett minnesblock måste du tilldela ett nytt block av önskad storlek, kopiera data från det gamla minnet och ta bort det gamla blocket. C++ Standard Library ger stöd för en dynamisk array som kan ökas eller minskas i sin mallklass std::vector.

Se även

Länkar

Anteckningar

  1. Vet vi allt om de nya och raderade operatörerna? (inte tillgänglig länk) . Hämtad 9 juli 2013. Arkiverad från originalet 14 juli 2013.