2010-11-18 26 views
1

C++ uygulaması çalışırken çok rahatsız edici bir sorun var. Windows Xp'in Interix alt sisteminde pgcpp derleyicisini kullanıyorum. Sorunum burada açıklanmıştır:C++ uygulaması, bir nesne nesnesini başlatırken çöküyor.

Başlık dosyasında bir sınıf tanımım var. Bu başlık dosyası bir kaynak dosyada bulunur. Bu sınıfın iki kurucusu vardır ve temel olarak bir kaydediciyi uygulamak için kullanılır. İlk kurucu argümanı olarak dışarı atmayı * yaparken, ikinci aşırı yüklenmiş kurucu bir dosya adı ve varsayılan bir false değeri yanlışı alır. Bu ikinci kurucunun amacı, geçirdiğimiz dosya adı için bir akış almak ve mesajların kaydını başlatmaktır.

MessageLogger::MessageLogger(std::ostream *out): p_out (out), p_ofstream (0) 
{ 
    if (p_out) 
    { 
     (*p_out) << "Started logging messages" << endl; 
    } 
} 

MessageLogger::MessageLogger (char const *filename, bool append_to_file) : p_out (0), p_ofstream (0) 
{ 
    if (append_to_file) 
    { 
    p_ofstream = new std::ofstream (filename, ios::app); 
    } 
    else 
    { 
     p_ofstream = new std::ofstream (filename); 
    } 

    p_out = p_ofstream; 

    if (p_out) 
    { 
     (*p_out) << "Started logging messages" << endl; 
    } 
} 

p_out ve p_ofstream beyanları aşağıdaki gibidir Nerede::

std::ostream *p_out; 
std::ofstream *p_ofstream; 
unsigned int p_indent_level; 

Tüm yukarıda belirtilen üç özel üyeleridir şöyle kurucularınızdaki kodudur.

MessageLogger logger ("filename"); 

o append_to_file yanlış varsayılan değeri vardır unutmayın: olarak MessageLogger sınıfının örneğinin yapılır. PGDBG da yanlış davranıyor. Denetimin p_ofstream = new std::ofstream (filename); adresinde ne zaman devreye girebileceğini anlayamıyorum ve rastgele bir konuma geçiyor ve uygulama çöküyor. Ayrıca

, ben PGDBG Karışık veya Demontaj kodunun de görmek çalıştığınızda mesajla ayıklayıcı çöker:

jpgdbg parse: Newline must follow cmd in 'eleq "0" struct MessageLogger *Mes 
sageLogger::MessageLogger(struct basic_ostream *out); (TranslatorGeneric.cpp 
) 
' 
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5 
jpgdbg parse: Newline must follow cmd in 'eleq "1" struct MessageLogger *Mes 
sageLogger::MessageLogger(char *filename, unsigned char append_to_file); (Tr 
anslatorGeneric.cpp) 
' 
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5 

Ben tam aynı yaptım nerede örnek bir programda bu yeniden alamıyorum Yukarıdaki gibi bir şey ama her şey iyi çalışıyor. Birisi neler olduğunu açıklayabilir mi ve eğer bunun bir çözümü varsa?

Teşekkürler, Aditya.

+0

Kodunuzda 'append_to_file' varsayılan değere sahip değil. –

+0

Uygulama veya hata ayıklayıcı hakkındaki sorunuz mu var? Her iki durumda da: Tam olarak ne soruyorsunuz? –

+0

Soru, başarısız olan uygulama hakkında. Hata ayıklayıcı, paylaşmam gerektiğini düşündüğüm bir sorun. Append_to_file öğesi false olarak ayarlandı. Üzgünüm, tüm kodu gösterdim. – Aditya

cevap

0

Neden dinamik olarak ayrılmış bir akış örneğini kullanıyorsunuz? Neden ...

class Logger 
{ 
    public: 
    Logger(ostream& str) : _str(str.rdbuf()) // use the buffer from the stream 
    { 
     _str << "writing to passed in buffer" << endl; 
    } 
    Logger(const char* fname, bool append = false) : _str(cout.rdbuf()) 
    { 
     _file.open(fname, (append)? ios::out|ios::app : ios::out); 
     if (_file.is_open()) 
     _str.rdbuf(&_file); // redirects to file, else remains on cout 

     _str << "expected to be logging to: " << fname << endl; 
    } 

    // use as needed 

    private: 
    filebuf _file; 
    ostream _str; 
}; 

aşağıdaki gibi dosya, hala günlük çıkış Assurance için gidiş gerekecek başarısız olsa bile bu şekilde ... Geri sorununuza

şey yapmıyoruz , HW_NEW ne yapar? Sağladığınız temel bilgilerle gerçekten söylemek zor…

+0

Bu, Windows'a geçiş yapmaya çalıştığım çok büyük bir uygulamanın parçası. Bu yüzden gerçekten nasıl kontrol edeceğimi veya nasıl yapacağımı bilmiyorum. Sorumu netleştirmek için sorumu düzenledim. Cevabınız için teşekkürler. Şimdi bakıp bana bunun neden başarısız olduğunu söyler misin? Ben bahsettiğim örnek kod da pgcpp kullanılarak derlenmiştir ve bu yüzden bir derleyici sorun olduğunu düşünmüyorum. Yanlış anlamadığım sürece? – Aditya

+0

tamam, en başa geri dönün, tüm nesneleri/kütüphaneleri doğru şekilde oluşturdunuz mu (yani hepsi doğru üstbilgileri kullanıyor muydunuz?)? Aynı başlık dosyasının farklı sürümleriyle derlenmiş nesneler varsa rasgele çökmeler olabilir. İlk adım olarak, her şeyi temizler ve yeniden derlerdim. Bu işlem tamamlandığında, gerçekten de çökmenin gerçekleştiğini (hata ayıklama etkin bir yapıyla) onaylayın. Daha sonra, hata ayıklayıcısında deneyin, yukarıdaki kodun tamamının olması gerekir ve kazaların meydana gelmesi eş zamanlı olarak olabilir. – Nim

+0

Bu uygulamanın tamamını oluşturmak için bir meslektaşım vardı. Aynı şey onunla birlikte olur. Yeni bir şey yaptık. Oluşabilecek bazı C++/derleyici ile ilgili hataları görüp görmediğinizi söyleyebilir misiniz? Veya bu sadece ortada kaput olan bir şey - eğer böyle bir şey mümkün olursa. – Aditya