İşaretçilerin neden önemli olduğunu gerçekten anlamak için yığın ayırma ve yığın ayırma arasındaki farkı anlamanız gerekir.
Bir yığın tahsisi örneği aşağıda verilmektedir:
struct Foo {
int bar, baz
};
void foo(void) {
struct Foo f;
}
Yığına ayrılan nesneler yalnızca geçerli fonksiyon yürütme süresince var olur. Çağrı foo
kapsam dışına çıktığında değişken de öyle f
.
Bunun bir sorun haline geldiği durumlardan biri, bir fonksiyondan integral bir türden başka bir şey döndürmeniz gerektiği zamandır (örneğin yukarıdaki örnekten Foo yapısı).
Örneğin, aşağıdaki işlev "tanımsız davranış" olarak adlandırılır.
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
struct Foo f;
return &f;
}
struct Foo *
Bir fonksiyondan benzer bir şey döndürmek istiyorsanız, gerçekten ihtiyacınız olan şey bir yığın tahsisidir:
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
return malloc(sizeof(struct Foo));
}
İşlev malloc
öbek üzerinde bir nesne atar ve o nesneye bir işaretçi döndürür. Burada "nesne" teriminin gevşek bir şekilde kullanıldığını, nesne yönelimli programlama anlamında nesne yerine "bir şey" anlamına geldiğini unutmayın.
Yığınla ayrılmış nesnelerin ömrü programlayıcı tarafından kontrol edilir. Bu nesnenin hafızası, programlayıcı onu serbest bırakana kadar, yani çağrı yaparak free()
veya program çıkana kadar saklanır .
Düzenleme : Bu sorunun C ++ sorusu olarak etiketlendiğini fark etmedim. C ++ operatörleri new
ve new[]
aynı işlevi gerçekleştirir malloc
. Operatörler delete
ve delete[]
benzer free
. İken new
ve delete
++ nesneleri ayırmak ve serbest C münhasıran kullanılması gerektiğini, kullanılması malloc
ve free
C ++ kodunda tamamen yasal.