2011-02-14 15 views
6

Çok büyük bir uygulama (birkaç milyon LOC ve on binlerce dosya) alıyorum ve bellek sızıntılarını tespit etmek için debug crt'yi kullanmaya çalışıyorum. Ben çalışıyorum bu yüzden gibi yeni makro-ize: Benim için, ideal olarak, bir başlık dosyasında koymak istiyorum ve özellikle dahil böylece Şimdi Yeni yerleşim alanıyla yeni makro çakışmaları yerine yeni

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 
#ifndef NEW_DEBUG 
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new NEW_DEBUG 
#endif 

, uygulamamı kadar büyük olduğunu onbinlerce içinde CPP dosyaları. Eğlenceli bir görev değil. Bu yüzden, bunu her çeviri birimine dahil edilecek olan SDK'mızda ortak bir başlık dosyasına yerleştirmeyi denedim.

Karşılaştığım sorun, bazı STL üstbilgi dosyalarıyla çakışıyor gibi görünüyor ve yeni yerleştirme kullanıldığında derleyici hata veriyor. Kendi kodumda pragma'yı kullanarak ve yeni makroyu devre dışı bırakarak bunu değiştirebilirim. Orada sorun yok. Yerleşim yeni kullanan STL üstbilgi dosyaları, değiştiremiyorum.

çalışma çevresinde çalışma ortamını yeniden düzenleyerek, cpp dosyalarındaki yönergeleri yeniden düzenleyerek anladım. Örneğin:

// doesn't compile 
#include "new_redirect.h" 
#include <map> // for instance 

// does compile 
#include <map> // for instance 
#include "new_redirect.h" 

Ama bu bir tekrar, binlerce dosya değiştirmek gidin ve onların STL başlıkları başka önce şey dahil edildiğinden emin olmak zorunda çünkü iş çevresinde zor. Ironik şey, bu sorunu özellikle test etmek için bir merhaba dünya uygulaması yarattı: Ve benim merhaba dünya uygulaması iyi derlenmiş. Ama benim büyük uygulamam, bu iş olmadan.

Yani benim sorular şunlardır:

  1. herkes mümkün olmuştur makro ize kod büyük miktarda jiggling kalmadan yeni tamamen? (Göreceli olarak ağrısız bir şekilde)
  2. STL başlığımı yeniden düzenlemek için başka bir yol da direktifleri içeriyor mu?

Teşekkür

+0

http://stackoverflow.com/questions/4301505/compile- ile geçecek -I-using-crt-bellek-sızıntısı-algılama hataları ne zaman? – sharptooth

+0

Hayır, ama bunu okuduktan sonra, bunu kullanmanın ümitlerini tabuttaki çivi gibi hissettiriyor ... –

+0

'new''i yeniden tanımlamak genellikle kötü bir fikirdir (tm). Ayrıca bkz. [Here] (http://stackoverflow.com/questions/3202520/) ve [here] (http://stackoverflow.com/questions/1326656/). –

cevap

3

Sen variadic makro ile yeni bir yerleşim yakalayabilirsiniz:


#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__) 
#define new NEW_DEBUG 

Ama önişlemci hem argümanlarla ve olmayan makro ve makro tanımlayan izin vermiyor argümanlar olmadan ilk olarak, uygulanır, böylece tek bir önişlemci geçişi ile bunu yapmak için bir yol bulamadım. Ama önce çalıştırmak yukarıdaki makrolar ve/E ile geçerdi eğer, iki ile mümkün gözükmektedir, sonra ikinci Bu soruyu Görülme


#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define NEW_DEBUG2(...) new(__VA_ARGS__) 
+0

Mükemmel cevap için teşekkürler. Sadece iki geçiş yapan bir derleyici için umut edebiliriz sanırım .... beklemeyin, kullanmayan bir programlama dili istiyorum. Ah ne dağınıklık. –