2013-06-10 25 views
5

Daha büyük bir programda bellek sızıntısı yaşıyorum ve bunun bunun nedeni olduğuna inanıyorum.char pointer, struct array bellek sızıntısıdır

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

İlk durakta bellek: ~ 500K.

İkinci durakta bellek: ~ 1.7M.

Test için VS2012'yi kullanma. Herhangi bir fikir?

+1

Sizin kodunuz yanlış görünüyor. Bellek kullanımını nasıl ölçüyorsunuz? Yığın yöneticinizin, 'ücretsiz' çağrılarınızı takip ederek yığınını sıkıştırmamış olması mümkün mü? Bu durumda, işleminize fazladan bir bellek atanır, ancak programınız tarafından kullanılmazdı, bu nedenle diğer kodların tahsis edilebilmesi mümkün olurdu. – simonc

+0

Malloc kullandığınızda, malloc'dan geri dönüş almamalıysanız (Character == NULL) – hazzelnuttie

+0

belleğin gerçekten tahsis edilip edilmediğini kontrol ettiğinizden emin olun. Bu C ve herhangi bir şeye * boşluk atayabilirsiniz. –

cevap

4

Programın kapladığı bellek miktarını nasıl ölçüyorsunuz? Başımın tepesindeki bir şey, işletim sisteminin izini sürdüğü çalışma setinin boyutuna bakıyor olmanız. Çok fazla bellek ayırdığınız ve serbest bıraktığınız için, bu kümenin boyutu artmıştır. Bazı OS'ler bir süre sonra çalışma setinin boyutunu ayarlayacak, bazıları olmayacak. Hangi işletim sistemine bakıyoruz?

+0

Windows 7 Görev Yöneticisi'nden en son ve bellek kullanımı – Marc

+0

Windows'un ne yaptığını tam olarak bilmiyorum (daha sonra veya bir başkasının girebileceği), ancak muhtemelen beklediğinizi göstermez. Modern işletim sistemleri, işlem belleğini işlemden tasarruf etmek için brüt ve tembel bir şekilde yönetir ve sayfaların ayrılmasını geciktirebilir. Malloc ve ücretsiz uygulama hafıza da olabilir. Gerçekten emin olmak istiyorsanız, sızıntı olup olmadığını kontrol etmek için valgrind gibi bir araç kullanın. – idoby

+0

Sadece DrMemory ile çalıştırdım ve 319 hala ulaşılabilir tahsisat ile 3 (1536 bytes) olası sızıntı bulundu. – Marc

3

malloc numaralı telefonu aradığınızda, öbekte bellek ayrılır. Yığın üzerinde yeterli alan kalmazsa, program OS'den daha fazla bellek ister ve başka bir yığın elde edilir. İşletim sisteminden alınan bellek, program bitene kadar genellikle iade edilmez (bu işletim sistemine bağlı olsa da).

Program boyutu yalnızca bellek sızıntılarını kontrol etmek için kullanılamaz! Asla free d alır bellek kontrol etmek için Valgrind veya benzeri bir araç kullanın.

-1

str * Karakter = (str *) malloc (sizeof (str) * 20000);

Yukarıdaki satırda, yapının boyutunu bularak belleği ayırıyorsunuz. Burada alacağınız yapının büyüklüğü, işaretçinin genişliğinin büyüklüğü değil, büyüklüğünün büyüklüğü olacaktır. Örneğin, işaretçi genişliğinin 32 bit olması durumunda (4 * 20000) = 80000 bayt olacağını varsayalım.

Eğer 20000 yapı yıllardan için tahsis etmek istiyorsanız

,

str * Karakter = (str *) malloc (sizeof (char) * 20000);

+1

str * Karakter bir dizi yapıdır, karakterleri değil (karıştırabildiğim isim) böylece sizeof (str) doğrudur –