delete operator
delete operator aynı zamanda "delete expression" olarak ta bilinir. delete operator belleği işletim sistemine geri vermek zorunda değildir.
global delete operator
Açıklaması şöyle
Global delete operator kullanmak için ::delete şeklinde kullanılır. Şöyle yaparız.
delete operator ve sanitization (hijyen)
delete operator silinen pointer'a yeni bir değer atar (temizlik açısından) veya atayamaz diye bir kural yok. Bunun gerekli olup olmadığı uzun yıllar boyunca tartışıldı. Belli bir uzlaşmaya varılmadı. Derleyiciler kendi kurallarını uyguluyorlar.
Örneğin Visual Studio 2015'ten itibaren delete operator'ü pointer'a 0x8123 değerini atıyor. Elimizde şöyle bir kod olsun
global delete operator
Açıklaması şöyle
In some cases, the operator delete might be redefined -actually overloaded- (for example, your Class might define it and also define operator new). By coding ::delete you say that you are using the standard, "predefined", deletion operator.Örnek
A typical use case for redefining both operator new and operator delete in some Class: you want to keep a hidden global set of all pointers created by your Class::operator new and deleted by your Class::operator delete. But the implementation of your delete will remove that pointer from the global set before calling the global ::delete
Global delete operator kullanmak için ::delete şeklinde kullanılır. Şöyle yaparız.
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
delete operator ve sanitization (hijyen)
delete operator silinen pointer'a yeni bir değer atar (temizlik açısından) veya atayamaz diye bir kural yok. Bunun gerekli olup olmadığı uzun yıllar boyunca tartışıldı. Belli bir uzlaşmaya varılmadı. Derleyiciler kendi kurallarını uyguluyorlar.
Örneğin Visual Studio 2015'ten itibaren delete operator'ü pointer'a 0x8123 değerini atıyor. Elimizde şöyle bir kod olsun
#include <iostream>
using namespace std;
int main()
{
int* ptr = new int;
cout << "ptr = " << ptr << endl;
delete ptr;
cout << "ptr = " << ptr << endl;
system("pause");
return 0;
}
Çıktı olarak şunu alırız.ptr = 0050BC10
ptr = 00008123
double delete
double delete tanımsız davranış (undefined behavior) getirir.
Obj *op = new Obj;
Obj *op2 = op;
delete op;
delete op2; // What happens here?
delete [] ve delete işlemlerinin karıştırılması
new ile alınan bellek mutlaka delete ile silinmeli.
new[] ile alınan bellek tek boyutlu dizi olsa bile mutlaka delete [] ile silinmeli.
new[] ile alınan bellek tek boyutlu dizi olsa bile mutlaka delete [] ile silinmeli.
char * ch = new char;
delete ch; //OK
char * ch = new char;
delete[] ch; //Error
char * ch = new char[1];
delete ch; //Error !
char * ch = new char [1];
delete[] ch; //OK
iki boyutlu dizi için delete
Array şöyle yaratılır.
void* delete edilemez. Açıklaması şöyle.
int** myArray = new int*[100];
for(int i = 0; i < 100; i++){
myArray[i] = new int[3];
}
Sonra şöyle silinir.for(int i = 0; i < 100; i++)
delete [] myArray[i]; // delete all "rows" in every "column"
delete [] myArray; // delete all "columns"
void* için deletevoid* delete edilemez. Açıklaması şöyle.
Şu kod hatalı.warning: cannot delete expression with pointer-to-'void' type 'void *' [-Wdelete-incomplete]
void foo(void* p) {
delete p;
}
Hiç yorum yok:
Yorum Gönder