2013-10-23 39 views
5

Büyük bir döngüde tekrar tekrar bir işlev çalıştırmaya çalışıyorum ama 2 veya 3 yinelemeden sonra bir hata alıyorum ama eğer bir noktadan başlayıp bir hata verdiyse iyi çalışıyor ama yine 3 sonra duruyor 4 tekrarlama. Bir hafıza problemi olabilir. Fonksiyon oldukça büyük olduğundan, bir bellek sızıntısının tam olarak nerede bulunduğundan emin değilim. Yine de her iterasyondan sonra ya da bu problemi çözebilecek bir şeyden sonra değişkenleri serbest bırakabiliyorum. Ya da bağlantılı bir liste hafıza problemi olduğu için, tüm bağlı liste veya bir şey ücretsiz? Çözüm ne olabilir? Fonksiyonu bir kez çalıştırırsam problrm olmaz çünkü bence bir döngüde tekrar tekrar fonksiyon çağırıyorum. Bu sorunu çözmenin bir yolu var mı? kütüphane bellek meta bozuk olduğunu size anlatıyorglibc smallbin bağlantılı listeyi bozuk

**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 *** 

cevap

18

hatadır. Bu sadece bellek sızıntısı ile olmaz, geçersiz işaretçiye yazmak zorunda kaldınız. Ya sınırların dışına çıkmayı yazdınız ya da serbest bırakıldıktan sonra işaretçiye yazdınız.

Bu tür bir hata ayıklamanın en kolay yolu valgrind kullanıyor. Sadece Linux altında çalışıyor, ama bunu zaten kullanıyor gibi görünüyorsun. Program oldukça yavaştır, çünkü programı tek adımda uygular ve her bellek erişim talimatını kontrol eder, ancak geçersiz bellek erişimini ve başlatılmamış değişkenleri ve bellek sızıntılarını çok güvenilir şekilde kullanabilir.

Ayrıca duma (detect unintended memory access) kitaplığı da vardır. Diğer platformlarda çalışmak için de yapılabilir ve biraz daha hızlıdır, ancak çok daha fazla bellek kullanır.

Ayrıca, belirli derleyici seçenekleri tarafından etkinleştirilebilen gcc'nin kendi mudflap'u vardır. Bu en gcc hedefleri üzerinde çalışmalıdır, ancak C++ desteğinin ne kadar tamamlandığından emin değilim.

+0

Programımın farklı bölümlerinde aynı hatayı alıyorum bu yüzden hatanın nerede olduğunu belirleyemiyorum valgrind.Thanks'i kullanmaya çalışacağım. – user1583647

+0

@ user1583647: Yolsuzluk genellikle rastlantısal-rastgele ve standart kütüphane yalnızca gerçekten gerçekleştikten sonra onu tespit ediyor. Ancak geçersiz erişim gerçekleştiğinde valgrind yakalayabilir. –

+0

Programın standart kütüphanesinden başka programın bellek sızıntılarını veya hafıza sorunlarını almanın bir yolu var mı? – user1583647

0

Uyarı: Çok özel bir kullanım durumu

Ben kopya kurucu vardı QObject türetilmiş bir nesneye işaretçileri kullanılarak nerede Qt ile yazılmış bir uygulama içinde bu sorunu vardı. O QObject türevi nesneleri are not supposed to be copied

warning: base class ‘class QObject’ should be explicitly initialized in the copy constructor [-Wextra] 

O döner dışarı ama bu tür bir hata neden benim QObject -çıkarılmış sınıfına kopya kurucu beklemiyorduk: ben bir şekilde derleme sırasında aşağıdaki uyarıyı gözardı.

İlgili konular