new er en C++ programmeringssprogsoperatør , der giver dynamisk hukommelsesallokering på heapen . Med undtagelse af en formular kaldet " allokeringsformular ny ", forsøger at allokere nok hukommelse på heapen til at rumme de nye data og, hvis det lykkes, returnerer adressen på den tildelte hukommelsesplacering. Men hvis den ikke kan allokere hukommelse på heapen, vil den kaste en undtagelse af typen . Dette eliminerer behovet for eksplicit at kontrollere udvælgelsesresultatet. Efter at compileren støder på nøgleordet, genererer den et kald til klassekonstruktøren [1] . newnewstd::bad_allocnew
Syntaksen newser således ud:
p_var = nyt typenavn ;hvor er p_var den tidligere erklærede typemarkørtypename . typenamekan betyde enhver grundlæggende datatype eller brugerdefineret objekt (herunder , enum, classog struct). Hvis typename er en klasse- eller strukturtype, skal den have en tilgængelig standardkonstruktør , der vil blive kaldt for at oprette objektet.
For at initialisere en ny variabel oprettet med newskal du bruge følgende syntaks:
p_var = ny type ( initializer );hvor initializer er startværdien tildelt til den nye variabel, og hvis type er klassens type, så initializer er konstruktorens argument(er).
newkan også oprette et array :
p_var = nytype [ størrelse ] ;I dette tilfælde sizeangiver dimensionen (længden) af det oprettede endimensionelle array. Adressen på det første element returneres og placeres i p_var, så
p_var [ n ]betyder værdien af det n-th element (tæller fra position nul)
Hukommelse allokeret med newskal frigøres med for at deleteundgå en hukommelseslækage . Arrays tildelt (oprettet) med new[], skal frigives (ødelægges) med delete[].
int * p_scalar = ny int ( 5 ); int * p_array = ny int [ 5 ];Initializere kan ikke angives for arrays oprettet med new. Alle array-elementer initialiseres ved hjælp af standardkonstruktøren for den givne type. Hvis typen ikke har en standardkonstruktør, vil det tildelte hukommelsesområde ikke blive initialiseret.
Der er en særlig form for den nye operatør kaldet Placering ny. Denne operatør allokerer ikke hukommelse, men tager som sit argument en adresse til hukommelse, der allerede er allokeret på en eller anden måde (for eksempel på stakken eller gennem malloc ()). Objektet allokeres (initialiseres) ved at kalde konstruktøren, og objektet oprettes i hukommelsen på den angivne adresse. Ofte bruges denne metode, når klassen ikke har en standardkonstruktør, og du skal oprette en række objekter. Et eksempelopkald ser sådan ud:
#include <ny> // Påkrævet for at bruge ny placering klasse A { offentligt : A ( int x ){} ~ A (){} }; const int n = 50 ; A * placementMemory = static_cast < A *> ( operator new [] ( n * sizeof ( A ))); for ( int i = 0 ; i < n ; i ++ ) { ny ( placeringHukommelse + i ) A ( rand ()); //her er hukommelsen for objektet ikke allokeret, men initialiseret } //!!hukommelsesdeinitialisering for ( int i = 0 ; i < n ; i ++ ) { placeringHukommelse [ i ]. ~ A (); } operator slet [] ( placementMemory );Da typen af det eller de objekter, der oprettes, ikke blev specificeret, da hukommelsen blev allokeret, vil compileren ikke kalde destruktoren for hvert array-objekt, så dette skal gøres manuelt, før hukommelsesblokken frigøres.
I compilere , der overholder ISO C++-standarden , er der en undtagelse af typen , hvis der ikke er nok hukommelse til at allokere std::bad_alloc. Udførelse af al efterfølgende kode stopper, indtil fejlen er håndteret i en try-catch-blok, eller programmet afsluttes unormalt. Programmet behøver ikke at kontrollere værdien af pointeren; hvis ingen undtagelse blev kastet, så var tildelingen vellykket. Implementerede operationer er defineret i overskriften <new>. I de fleste C++-implementeringer kan operatøren newogså blive overbelastet for at definere speciel adfærd.
Enhver dynamisk hukommelse tildelt med new, skal frigøres med delete. Der er to muligheder: en for arrays, den anden for enkelte objekter.
int * p_var = ny int ; int * p_array = new int [ 50 ]; slet p_var ; slet [] p_array ;Standarden kræver ikke, at compileren genererer en diagnosticeringsmeddelelse, når den bruges forkert delete; den kan generelt ikke vide, hvornår en markør peger på et enkelt element, og hvornår den peger på en række elementer. Desuden er brug af en upassende udgivelse udefineret adfærd .
I modsætning til en funktion realloci C kan en operatør new[]ikke direkte omallokere allerede allokeret hukommelse. For at øge eller mindske størrelsen af en hukommelsesblok skal du tildele en ny blok af den ønskede størrelse, kopiere dataene fra den gamle hukommelse og slette den gamle blok. C++-standardbiblioteket understøtter et dynamisk array , der kan øges eller formindskes i dets skabelonklasse std::vector.