2013-04-18 20 views
7

Bazı bellek sızıntısı ile ilgili çalışmalar yaparken, bu net üzerinden karşılaştım."asılı referans" ve "genel koruma hatası" nedir?

int* Function() 

{ 

    int arrays[10]; 

    /* Some code here */ 

    return &(arrays[0]); 

} 

yazar kod yukarıdaki parça geçerlidir ancak döndürülen bellek aramak sonraki işlevi tarafından yeniden ve böylece, aynı bellek iki amaçla kullanılır olacağını söylüyor. Buna "asılı referans" denir ve korkunç aralıklı arızalara veya eski moda "genel koruma hatası" na neden olabilir.

birileri bu resmi açıklamalar ise bilmiyorum ama bu örnek için daha iyi bir anlam veriyor umut & "genel koruma hatasına"

+2

yazar sonra çok iyi C bilmiyor, yoksa onu yanlış tanıtıyor ediyoruz. Program tanımlanmamış bir davranışa sahiptir. –

+2

Bu işlev, belleğe tam olarak sızmıyor çünkü işlev döndüğünde ayrılmış dizi otomatik olarak ayrılacak. Bu, asılı bir referansla kastedilen şey, yığında ayrılan bir belleğe bir gösterici döndürüyorsunuz.İşlev döndüğünde, yığın ayrılmış dizi ayrılır, böylece bellekteki konum bir sonraki işlev çağrısı için verilere yazılabilir, böylece döndürülen işaretçiyi iptal etmek tanımsız bir değer verecektir. –

+0

Yup, Asılı referans, artık mevcut olmayan yığıntaki bir şeye gönderme anlamına gelir. "Genel koruma hatası" hakkında bir fikir var mı? –

cevap

2

"referansı asılı" ne açıklayabilir eğer çok iyi olurdu:

asılı referans: geri bildirimi dizileri için bir başvuru (pointer) döndürür. Bununla birlikte, işlev kapatıldıktan sonra bellek (veya kaldırılabilir), böylece asılı referans olarak adlandırılan ayrılmış belleğe işaret etmeyen bir referans vardır.

Bu genel koruma hatasına neden olabilir. Genel olarak, tahsis edilmeyen bellek yazılmamalıdır. Bunu yapmaya çalışırsanız, genel koruma hatası işletim sistemi tarafından yükseltilebilir. Function çağrıldığında

1

arrays yığında tahsis edilir. Function, yığında ayrılan bir yapının adresini döndürür. Function döndüğünde, yığın işaretçisi geri atılır ancak verileri hala yığınta. yığının önceden yayımlanmış bölge başka bir fonksiyon ya da kapsam tarafından kullanılacak zaman , bu işlev hala geçerli geri işaretçi potansiyel erişilebilir istifin bir kısmına yerel kapsam verilerinizdir yazacaktır.

bu 2 sonucu vardır: Eğer dışarıda Function gelen diziler verilere erişmek çalışırsanız

  • , bu verileri artık güvenilir olduğunu ve yığın bölgesini üzerine yeni bir ayırma tarafından bozulmuş (yakında veya daha az) olacak .
  • tüm bu en alanlarına başlangıç ​​etmezse yığınının üzerine tahsis edilen yeni işlev
  • ,

sonuç tanımsız davranıştır bazı kirli verileri içerebilir ve çok seçenekleri derleyici bağlıdır derlemek. ayrılacak dizinin otomatik olarak fonksiyon döner ayırmanın beri

2

Bu tam, bellek sızmaz. Bu, asılı bir referansla kastedilen şey, yığında ayrılan bir belleğe bir gösterici döndürüyorsunuz. İşlev döndüğünde, yığın ayrılmış dizi ayrılır, böylece bellekteki konum bir sonraki işlev çağrısı için verilere yazılabilir, böylece döndürülen işaretçiyi iptal etmek tanımsız bir değer verecektir. Bu, genel bir koruma hatasına neden olabilir, çünkü işaretçinin değeri geçerli adres alanının dışına işaret edecek şekilde değişebilir, böyle bir işaretçinin kaldırılması genel koruma hatasına neden olabilir.

İlgili konular