削除は オペレーター それは慣れています 配列を破壊する そして 非配列 (ポインタ) オブジェクト によって動的に作成されます。 新しい オペレーター。
- delete は、次のいずれかを使用して使用できます。 削除演算子 または [ ] 演算子を削除します。
- の 新しい 演算子は、変数をヒープ メモリに保存する動的メモリ割り当てに使用されます。
- これは、削除演算子がメモリからメモリの割り当てを解除することを意味します。 ヒープ 。
- オブジェクトへのポインタは破壊されません。ポインタが指す値またはメモリ ブロックは破壊されます。
- 削除演算子には、 空所 戻り値の型。値を返さないことを意味します。
以下に、削除演算子を適用できる例をいくつか示します。
1. 配列オブジェクトの削除
[] 括弧を使用して配列を削除します。
C++
// 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. NULLポインタの削除
NULL を削除しても何も変更されず、エラーも発生しません。
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. 値の有無にかかわらずポインタを削除する
指定されたポインタが指すメモリは、ヒープ メモリから割り当て解除されます。
C++
CPLD対FPGA
// 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;> }> |
>
>出力
Value of ptr1 = 0 Value of ptr2 = 20>
4. ボイドポインタの削除
delete オペレーターは、メモリーの割り当てを解除するだけでなく、削除するオブジェクトのデストラクターも呼び出します。そのため、削除で void ポインターを使用すると、未定義の動作が発生します。
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;> }> |
>
>出力
ptr deleted successfully>
5. malloc()で動的に割り当てられたメモリの削除
削除演算子を使用して malloc() によって割り当てられたメモリの割り当てを解除すると、未定義の動作が発生します。 new には delete を使用し、malloc には free() を使用することをお勧めします。
C++
// 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;> }> |
>
>出力
GBとは何ですか
ptr2 deleted successfully>
注記 : ただし、上記のプログラムは GCC 上で正常に動作します。 malloc() で delete を使用することはお勧めできません。
6. ユーザー定義データ型の変数の削除
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;> }> |
>
>出力
custom delete for size 1 custom delete for size 18>
例外
1. 非ポインター オブジェクトを削除しようとしている
C++
// 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;> }> |
>
>
出力
error: type ‘int’ argument given to ‘delete’, expected pointer>
2. スタックに割り当てられたローカル変数へのポインタを削除しようとしています
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;> }> |
おっと、Java の概念
>
>
出力
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>
関連記事
- 新しいキーワード
- C++のmalloc()