logo

ta bort nyckelord i C++

radera är en operatör som är van vid förstöra array och icke-array (pekare) föremål som skapas dynamiskt av ny operatör.

    radera kan användas antingen genom att använda ta bort operatör eller ta bort operatorn [ ].
  • De ny operatorn används för dynamisk minnesallokering som lagrar variabler i heapminnet.
  • Detta innebär att raderingsoperatören avallokerar minne från högen .
  • Pekaren till objektet förstörs inte, värdet eller minnesblocket som pekaren pekar förstörs.
  • Raderingsoperatören har tomhet returtyp vilket betyder att den inte returnerar något värde.

Nedan följer några exempel på var vi kan tillämpa delete-operatorn:



1. Ta bort Array-objekt

Vi tar bort en array med [] parenteser.

C++




instans av i java





// Program to illustrate deletion of array> #include> using> namespace> std;> int> main()> {> >// Allocate Heap memory> >int>* array =>new> int>[10];> >// Deallocate Heap memory> >delete>[] array;> >return> 0;> }>

>

>

2. Ta bort NULL-pekaren

Att ta bort en NULL orsakar ingen förändring och ger inget fel.

C++




// C++ program for deleting> // NULLL pointer> #include> using> namespace> std;> int> main()> {> >// ptr is NULL pointer> >int>* ptr = NULL;> >// deleting ptr> >delete> ptr;> >return> 0;> }>

>

>

3. Ta bort pekare med eller utan värde

Minnet som pekas ut av den specificerade pekaren kommer att avallokeras från heapminnet.

C++




// C++ program for deleting pointer with or without value> #include> using> namespace> std;> int> main()> {> >// Creating int pointer> >int>* ptr1 =>new> int>;> >// Initializing pointer with value 20> >int>* ptr2 =>new> int>(20);> >cout <<>'Value of ptr1 = '> << *ptr1 <<>' '>;> >cout <<>'Value of ptr2 = '> << *ptr2 <<>' '>;> >// Destroying ptr1> >delete> ptr1;> >// Destroying ptr2> >delete> ptr2;> >return> 0;> }>

>

kat timpf vikt
>

Produktion

Value of ptr1 = 0 Value of ptr2 = 20>

4. Ta bort en tom pekare

Raderingsoperatorn avallokerar inte bara minnet, utan den anropar också förstöraren för objektet som ska raderas. Det är därför, om vi använder void pointer med delete, kommer det att leda till odefinierat beteende.

C++




// C++ prgram for deleting a void pointer> #include> using> namespace> std;> int> main()> {> >// Creating void pointer> >void>* ptr;> >// Destroying void pointer> >delete> ptr;> >cout <<>'ptr deleted successfully'>;> >return> 0;> }>

>

>

Produktion

ptr deleted successfully>

5. Ta bort minne som är dynamiskt allokerat av malloc()

Att avallokera minne som allokerats av malloc() med hjälp av delete-operatorn leder också till odefinierat beteende. Det rekommenderas att använda delete för new och free() för malloc.

C++


pyspark sql



// C++ program for deleting memory dynamically allocated by> // malloc> #include> using> namespace> std;> int> main()> {> >// Dynamic memory allocated by using malloc> >int>* ptr2 = (>int>*)>malloc>(>sizeof>(>int>));> >delete> ptr2;> >cout <<>'ptr2 deleted successfully'>;> >return> 0;> }>

är lika med metod java
>

>

Produktion

ptr2 deleted successfully>

Notera : Även om ovanstående program fungerar bra på GCC. Det rekommenderas inte att använda delete med malloc().

6. Ta bort variabler för användardefinierade datatyper

C++




// C++ program for deleting variables of User Defined data> // types> #include> using> namespace> std;> struct> P {> >// Overloading delete operator for single object> >// deallocation> >static> void> operator>delete>(>void>* ptr,>size_t> sz)> >{> >cout <<>'custom delete for size '> << sz << endl;> >// ::operator delete(ptr) can also be used> >::operator>delete>(ptr);> >}> >// Overloading delete operator for array deallocation> >static> void> operator>delete>[](>void>* ptr,>size_t> sz)> >{> >cout <<>'custom delete for size '> << sz << endl;> >// ::operator delete(ptr) can also be used> >::operator>delete>(ptr);> >}> };> int> main()> {> >P* var1 =>new> P;> >delete> var1;> >P* var2 =>new> P[10];> >delete>[] var2;> }>

>

>

Produktion

custom delete for size 1 custom delete for size 18>

Undantag

1. Försöker ta bort ett icke-pekande objekt

C++


lägga till strängar java



// C++ program for trying to delete a Non-pointer object> #include> using> namespace> std;> int> main()> {> >int> x;> >// Delete operator always> >// requires pointer as input> >delete> x;> >return> 0;> }>

>

>

Produktion

error: type ‘int’ argument given to ‘delete’, expected pointer>

2. Försöker ta bort pekaren till en lokal stacktilldelad variabel

C++




// C++ program for trying to delete the pointer to a local> // stack-allocated variable> #include> using> namespace> std;> int> main()> {> >int> x;> >int>* ptr1 = &x;> >// x is present on stack frame as> >// local variable, only dynamically> >// allocated variables can be destroyed> >// using delete operator> >delete> ptr1;> >return> 0;> }>

>

>

Produktion

main.cpp: In function ‘int main()’: main.cpp:16:12: warning: ‘void operator delete(void*, std::size_t)’ called on unallocated object ‘x’ [-Wfree-nonheap-object] 16 | delete ptr1; | ^~~~ main.cpp:9:9: note: declared here 9 | int x; | ^ free(): invalid pointer>

relaterade artiklar

  • nytt sökord
  • C++ malloc()