Pointer ve referansın ne olduklarını biliyorum. Ama ikisi arasında ki farklar tam olarak nedir ?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
February 14, 2018 Pointer ve Referans | ||||
---|---|---|---|---|
| ||||
Pointer ve referansın ne olduklarını biliyorum. Ama ikisi arasında ki farklar tam olarak nedir ? -- |
February 14, 2018 Pointer ve Referans | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsencan | Pointerlar çok güçlüler ama çok tehlikeliler. Bunu proje çok az büyüsün hemen görebiliyorsun. Bir de hafızadan dinamik olarak(malloc fonksiyonu veya new operatörü )alıp pointer atama yaptıktan sonra eğer pointer'ı silmeyi unutursan "memory leak" oluyor. Eğer bu "update loop" gibi kendini çok tekrar eden bir yerdeyse bir kaç dakka içinde bir bakmışssın hafıza kalmamış oluyor. Pointerların dezavantaları sıralayacak olursam : 1 - null pointer üzerinden kontrol etmeden ulaşım yapılırsa programımız çöküyor. A* a = nullptr; 2 - daha da kötüsü silinmiş(belleğe iade edilmiş) fakat null atanmamış bir pointer üzerinden bir fonksiyon çağırdığımızda "undefined behaviour" oluşuyor. En pisi de bu bence keşke patlasada nerde olduğunu anlasak diyor insan. A* a = new A; 3 - Daha da pis bir pointer dezavantajı, pointer aritmetiği. Şimdi ilk aklıma gelenler bunlar oldu. Böyle şeyler ile ömür tüketen biri olarak artık "new" operatörüne karşı bünyede alerji oluşuyor. Referanslar eğer mümkünse çok daha güvenli oluyorlar. Eğer mümkünse her zaman pointerlar yerine referanslar kullanılmalı. Bunlar büyülü şeyler değil tabi arka planda pointer'lar ile gerçekleştiriliyorlar fakat işin pis taraflarını derleyice bırakmak çok iyi oluyor. Referanslar pointerlar kadar esnek değiller. Kullanılmama sebepleri şunlar olabilir. 1 - Bir referansa başlangıç değer atamak zorundayız. class A class A 2 - Pointer 'lara "null" değeri atanıp kullanılabilir. Referanslarda null gibi ekstra bir opsiyon yoktur. A* foo() A& foo() Benim aklıma gelenler bunlar oldu. Her ikisini kullanırkende oluşabilen dangling pointer/referance durumu olabilir. Dikkat etmek lazım. Bunun dışında mümkün olduğunca referansları pointerlara tercih etmek lazım. Erdemdem Not: Yazmaya başladığımda Ali Abi'nin yazısı yoktu vay arkadaş en az yarım saat yazmışım demekki. -- |
February 14, 2018 Pointer ve Referans | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsencan | Arka planda hiçbir fark yok: ikisi de mikroişlemcinin sunduğu "şu adresteki değişkenden bahsetme" olanağını kullanıyorlar. Fark, programlama dili düzeyinde beliriyor. C++: "Hiçbir şeye referans" olmuyor ama "hiçbir şeyi gösteren gösterge (pointer)" olabiliyor. Farklı söz dizimi kullanıyorlar: 'gösterge->üye' ve 'referans.üye'. D'de bazı değişkenler referans olamıyor; örneğin, referans üye olamıyor ve referans yerel değişken olamıyor (gösterge kullanmak gerekiyor). D'de söz dizimi aynı 'gösterge.üye' ve 'referans.üye'. (D'de '->' işleci yok.) D'de sınıf değişkenleri nesne referansları:
Aklıma gelenler bunlar. Ali -- |
February 14, 2018 Pointer ve Referans | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerdemdemir | Söylediklerin doğru ama hemen hemen hepsi referanslar için de geçerli. Fark, kötü duruma düşmek göstergede kolay, referansta zor. D kullanarak gösteriyorum ama aynı durumlar C++'ta da var. Referans olduğu için güvenip kullanan foo() işlevi yüzünden program çöküyor:
Benzer örnekleri 2 ve 3 numaralı maddeler için de düşünebiliriz. Evet, açıkça gösterge kullanmak çok daha riskli ama büyük programlarda referanslar da kendilerini kötü durumlarda bulabilirler. :) D'nin en güzel taraflarından birisi, göstergelere hemen hemen hiç gerek olmuyor... demek istiyorum ama üye ve yerel değişken referans olamadığından oralarda gösterge gerekiyor. Ali -- |
October 02, 2019 Pointer ve Referans | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Konuyla alakalı bir başka başlık: http://ddili.org/forum/thread/1409 -- |