2013-10-20 25 views
5

Gizemli bir hata alıyorum ve nedenini bilmiyorum. Bu kod başarısız olmadan önce birkaç kez çalışır ve her zaman aynı noktada başarısız olur.Gizemli malloc: sysmalloc: Onaylanmadı hata

İşte benim kodudur:

assert(size > 0); 
    int* sorted = malloc(size * sizeof(int)); 

Ve burada ben bunu çalıştırdığınızda alıyorum hatadır:

malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

Ben boyutunu baskı denedim ve bu durumda 1'dir. Bu kod, başarısızlıktan önce 1 dahil olmak üzere çeşitli boyutlardaki değişkenlerle birkaç kez çalışır.

Neyi yanlış yaptığım hakkında bir fikri olan var mı?

Teşekkürler.

+0

Satır 2369 nedir? ' – ouah

+0

Mümkün yinelenen [Neden bir C malloc onaylama hatası aldım?] (Http://stackoverflow.com/questions/2987207/why-do-i-get-ac-malloc- savunu-başarısızlık) –

+2

@ouah Bence bu hat, posterin kodunun bir parçası yerine, malloc işlevinin bir parçasıdır; Muhtemelen o kütüphaneye kaynağa sahip değildir. – mah

cevap

6

Genellikle, kodunuz free d adresinden önceki bir zamanda geçersiz bir adres olduğunda veya tahsis edilen bellek bloğunun sonunu yazdığınızda gerçekleşir. Bunun gerçekleştiği noktayı görmek için kodunuzu valgrind veya başka bir bellek profiler aracılığıyla çalıştırın.

+0

Ücretsiz kullandım her zaman yorum yapmayı denedim. Hala hatayı alıyorum. – Ian

+0

@Ian Sonra, bellek ayırdığınız yerleri arayın ve her zaman doğru "sizeof" değerini sağlayıp sağlamadığınızı ve ayrıca bu belleğe ait dizinlerin doğru olup olmadığına bakın. Bu en berbat hatalar, onları bir bellek profiler olmadan bulmak çok zor. – dasblinkenlight

+1

Kodu kodla çalıştırmayı denedim ve bazı hatalar buldum. Hatanın gidip gitmediğini görmek için onları tamir etmeyi deneyeceğim. Teşekkürler! – Ian