SORU
13 Temmuz 2009, PAZARTESİ


Nasıl malloc() ve free() işe?

malloc free nasıl çalıştığını bilmek istiyorum.

int main()
{

    unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));
    memset(p,0,4);
    strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**
    cout << p;
    free(p); // Obvious Crash, but I need how it works and why crash.
    cout << p;
    return 0;
}

Eğer cevap eğer mümkünse hafıza düzeyinde derinlemesine, çok teşekkür ederim.

CEVAP
13 Temmuz 2009, PAZARTESİ


Tamam bazıları zaten yayınlanmıştır malloc hakkında cevaplar.

Daha ilginç kısmınasıl ücretsiz çalışır: (ve bu yönde, malloc daha iyi anlaşılabilir)

Birçok malloc/ücretsiz uygulamalar, ücretsiz normalde işletim sistemi bellek (ya da en azından sadece nadir durumlarda) döndürmez. Nedeni sadece boşlukları ile sanal bellek 2 veya 4 GB bitirmek senin öbek boşluklar alacak ve böylece olabilir. Bu sanal bellek biter bitmez, çok büyük bir dert olacağından, elbette kaçınılmalıdır. Tabii ki diğer nedeni, bu işletim sistemi sadece hafıza parçalarını kullanabilen özel boyut ve uyum vardır. Spesifik olmak gerekirse: Normalde işletim sistemi sadece sanal bellek yöneticisi işleyebileceği bir blok (genellikle 512 Bayt örn. katları işleyebilir 4 KB).

Yani OS için 40 Bayt dönen sadece çalışmaz. Özgür ne yapıyor?

Ücretsiz kendi ücretsiz blok listesinde bellek bloğu koyacağız. Normalde bu adres alanı içinde bitişik blok birleşmek için birlikte çalışır. Ücretsiz blok liste elbette başlangıçta bazı idari veri olan bellek parçaları dairesel bir listesini. Bu da standart malloc/free ile çok küçük bellek elemanları yönetmek verimli değildir nedeni vardır. Her bellek yığın ek veri ihtiyaçları ve daha küçük boyutlarda daha fazla parçalanma olur.

Serbest liste de malloc bellek yeni bir parça gerekli olduğunda baktığı ilk yerdir. OS yeni bir hafıza için çağırır önce taranır. Bir yığın gerekli bellek daha büyük olduğu zaman, sadece iki parçaya bölünür. Bir çağırana döndürülür, diğer boş liste içine yerleştirilir.

(Bellek küçük parçalar için örneğin) bu standart davranış için birçok farklı iyileştirmeler var. Ama malloc ve free yani evrensel olması gerektiğinden, standart davranış her zaman alternatifler kullanılabilir değildir. ne zaman geri dönüş olur. Ayrıca örnek listeler boyutları tarafından işletilen parçaları saklamak için ÜCRETSİZ-liste -- işleme en iyi duruma getirmeleri vardır. Ama tüm iyileştirmeleri de kendi sınırlamaları vardır.

Neden kod crash:

Sebebi, bu yazı 8 karakter içine alan büyüklükte 4 karakter, muhtemelen üzerine yönetim, veri saklanan bir diğer yığın bellek bulunan "arkasında" yığın veri (bu veri genellikle saklı "ön" anısına parçalar). Boş boş liste halinde yığın koymak için çalıştığında, bu yönetim, veri touch ve bu nedenle üzerine bir işaretçi üzerinde yanılmak olabilir. Bu sistem kilitlenmesine.

Bu oldukça zarif bir davranış. Ayrıca runnaway bir işaretçi bir yere geç ve sistemin hemen ama bazı değişmezler değil crash bellek-ÜCRETSİZ-liste üzerine veri olduğu durumlarda, gördüm. Orta karmaşıklıkta bir sistem gibi sorunlar, hata ayıklama için gerçekten çok zor olabilir! Dahil olduğum bir durumda, bir bellek dökümü tarafından gösterilenden tamamen farklı bir konumda olduğu için bize birkaç gün kaza sebebi buldu. Saatli bomba gibi. Bir sonraki" ya da "" crash, ama neden olduğunu bilmiyorsun! malloc "ücretsiz bilirsin

En kötü C/C sorunları ve bunun bir nedeni, işaretçiler çok sorunlu olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011