27 Ağustos 2018 Pazartesi

delete operator kullanımı - delete epxression

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
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.

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
Örnek
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.
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.
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 delete
void* delete edilemez. Açıklaması şöyle.
warning: cannot delete expression with pointer-to-'void' type 'void *' [-Wdelete-incomplete]
Şu kod hatalı.
void foo(void* p) {
  delete p;
}


Hiç yorum yok:

Yorum Gönder