2012-11-01 17 views
5

ben üzerinde çalışıyorum bir Windows uygulaması yığın bozulması izini _CrtCheckMemory nasıl kullanılacağını anlamaya çalışıyorum. false'u geri almak için görünmüyor olabilir. Yukarıdaki kodda_CrtCheckMemory kullanım örneği

int* test = new int[1]; 
for(int i = 0; i < 100; i++){ 
    test[i] = 1; 
} 
assert(_CrtCheckMemory()); 

, _CrtCheckMemory() döner doğru: İşte benim test kod. Debug modunda çalışıyorum. _CrtCheckMemory bir soruyu işaretlemenin basit bir örneğini almak için başka ne yapmam gerekiyor?

cevap

6

Ekstra bir adım gereklidir, derleyiciyi varsayılan yeni işlecini hata ayıklama ayırıcısıyla değiştirmeye ikna etmeniz gerekir. Yalnızca hata ayıklama ayırıcısı, yığın bloğunun altında veya üzerine yazılan alanları algılayan "alan dışı" alanları oluşturur. Bu riskli, orijinal ayırıcı ile derlenmiş kod, olmayan kodla iyi karışmayacak. Bu yüzden sizi açıkça seçmeye zorlar. en iyi (varsayılan olarak stdafx.h) Önceden derlenmiş başlık dosyasına bitti böylece tüm kod ayıklama ayırıcısı kullanır emin olabiliriz

. Şunun gibi:

#ifdef _DEBUG 
# define _CRTDBG_MAP_ALLOC 
# define _CRTDBG_MAP_ALLOC_NEW 
# include <crtdbg.h> 
# include <assert.h> 
#endif 

CRTDBG makroları malloc() işlevlerini ve yerine yeni operatörleri olsun.

yayınlanmıştır gibi kod başka tanısal ilk tetikleyecek olduğunu dikkat etmeyin. Windows Vista ve üstü, Windows yığın ayırıcı ilk olarak, kodun Windows yığın bütünlüğünü yok etmesinden dolayı şikayette bulunacak. 2.

+0

Hmmm, sadece diyelim ki, kadar endeksleme tarafından biraz incelikli üzerine olun. Önceden yüklenmiş bileşenlerinizi stdafx.h ve bağımlı bir projeye ekledim ve dizimin üzerine yazılmadan sonra durmuyor. Kafamı birazcık çizeceğim. Görünüşe göre bana bu konuda yardım edebilecek bir şey var. – morgancodes

+0

Bunu yayınlamadan önce kodunuzu kullanarak test ettim. İyi çalıştı. Gflags umhd.exe –

+0

Teşekkürler gibi başka bir araç kullanıyorsanız, yararlıdır. Yeni, son derece basit bir proje kurmak için bu _CrtCheckMemory'ın gerçekten çalıştığını görebiliyorum. – morgancodes