C++’ta pointer şeması, bir nesnenin bellekte nerede yaşadığını, hangi pointer’ın ona sahip olduğunu ve ne zaman serbest bırakılması gerektiğini anlamanın temel yoludur. Düşük seviyeli dillerde bellek yönetimi manuel olduğu için, yanlış yapılan her işlem memory leak (bellek sızıntısı), dangling pointer (boşta kalmış pointer) veya use-after-free gibi hatalara yol açabilir. Bellek sızıntısı, heap’te ayrılan bir bölgenin hiçbir pointer tarafından işaret edilmemesi ve asla serbest bırakılmaması durumudur. Dangling pointer ise serbest bırakılmış bir bölgeyi hâlâ göstermeye devam eden pointer’dır. Bu yüzden C++’ta “kim tahsis etti, kim serbest bırakacak, kaç pointer aynı nesneyi gösteriyor?” soruları sahiplik şemasının kritik parçalarıdır.
Aşağıdaki kısa örnek, heap’te nesne oluşturmayı, int** üzerinden sahiplik/alias aktarımını, bilinçli bir bellek sızıntısını, dangling pointer oluşumunu ve nasıl önlenebileceğini tek bir akış içinde gösterir.
#include <iostream>
using namespace std;
// Allocates an integer on the heap and returns its pointer
int* allocate(int value) {
return new int(value);
}
// Transfers ownership/alias by updating the external pointer
void transfer(int** target, int* source) {
*target = source;
}
int main() {
int* a = allocate(50); // a → [50] on HEAP
int* b = nullptr;
transfer(&b, a); // b now aliases a (b → [50])
// Intentional memory leak: allocated but never deleted
int* leak = allocate(999); // LEAK
cout << *a << " " << *b << endl; // both print 50
delete a; // frees [50], but both a and b are now dangling pointers
a = nullptr;
b = nullptr; // prevents accidental use-after-free
return 0;
}
