0

そのため、このアプリをまとめる行のどこかで、cstring クラス メンバーのデストラクタが呼び出されたときに、ランタイム チェック エラー スタックの破損が発生し始めました。問題にレンガを投げてこれをデバッグしようとするところまで来ましたが、まだルートが原因ではありません。現時点では、cstring が存在するクラスは、プライベート文字列メンバーを初期化し、別のクラスへのポインターを NULL に設定するだけです。

興味深いことに、クラス ポインタを NULL に設定せず、その行をコメント アウトすると、破損はなくなります。これはややこしいことだと思います。CLog の定義を含む .h ファイルを取り込むときに、コンパイラがコードをまとめる方法に何か変化が生じていると思います。そのオブジェクト。

    int _tmain(int argc, _TCHAR* argv[])
{

    DWORD a = 0xBABA; //just to help catch the corrupter
    DWORD b = 0xDFDF;

    CStringW startat = L"\\\\anetworkshare\\fre";
    CStringW lookfor = L".inf";

    DirEnum myEnum(startat,lookfor);

    ULONG en = a + b;

    en = a - b;

    return 0;
}

DirEnum.cpp


DirEnum::DirEnum(CString startingdir,CString fileFilter)
{
    m_plogfile = NULL;  //If you comment out this line corruption goes away
    m_startingdir = L"";
    m_extfilter = L"";

    if(startingdir.GetLength() > 0)
        m_startingdir = startingdir;

    if(fileFilter.GetLength() > 0)
        m_extfilter = fileFilter;

    //following commented out to tshoot
    //CLogBase& ref = ref.GetInstance();
    //logBase = &ref;

    //m_plogfile = new CLog(L"DirEnumerator",L"logfile.txt",logINFO);

}

ここで、log.h ファイルの何かが ATL または CString ライブラリで変更を引き起こしていると思われますが、何が原因かわかりません。ここに log.h ファイルがあります

#pragma once

//#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif


using namespace std;


#ifndef TYPEDEF_H
 #define TYPEDEF_H

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <tchar.h>
#include <time.h>



    //simple defines to allow the TCHAR library to be used
    typedef std::basic_string<TCHAR> tstring;
    typedef std::basic_ostream<TCHAR> tostream;
    typedef std::basic_istream<TCHAR> tistream;
    typedef std::basic_ostringstream<TCHAR> tostringstream;
    typedef std::basic_istringstream<TCHAR> tistringstream;
    typedef std::basic_ofstream<TCHAR>   tofstream;




    #if defined(UNICODE) || defined(_UNICODE)
        #define tcout std::wcout
        #define tcin std::wcin
    #else
        #define tcout std::cout
        #define tcin std::cin;
    #endif


 #endif

#if defined DEBUG || defined (_DEBUG)
#define TOCONSOLE
#endif


typedef enum LOGLVL{logERROR =0,logWARN,logINFO,logDEBUG};

//CLogBase os a singleton log class. Intent is that you can establish a reference from anywhere in the project and write to the same file 
// without having locking issues or threading issues

class CLogBase
{
public:
    static CLogBase& GetInstance(CString logname = L"log.txt",LOGLVL lvl = logWARN);
    ~CLogBase(void);

    tostringstream& GetLog(LOGLVL level);
    tostringstream& GetStream(LOGLVL);

    void Forceflush();


private:
    CLogBase(CString file,LOGLVL lvl);

    //our outstream

    tostringstream m_os;

    tostringstream m_dummy;

    tofstream m_filestream;

    CString m_filename;
    LOGLVL m_reportlvl;


    //Private declarations to prevent copy constructors from being invoked; these are do nothig implimentations 
    CLogBase(CLogBase const&);              
    void operator=(CLogBase const&); 


};


class CLog
{
public:
    CLog(CString component);
    CLog(CString component,CString logname,LOGLVL lvl);
    ~CLog();
    void Log(LOGLVL,CString message);
    void CLog::Flush();

    tostringstream& CLog::GetStream(LOGLVL lvl);


private:
    CString m_componentname;
    CLogBase* m_logBase;
};
4

1 に答える 1

0

問題を見つけたので、これに答えると思いました。これはコーディング自体の問題ではなく、ビジュアル スタジオの問題でした。何が起こったのかというと、direnum.h ファイルと .cpp ファイルを、メイン プロジェクトで使用したディレクトリとは別のディレクトリに保存していたということです。ある時点で #include "..\somedir\direnum.h" でヘッダーを参照すると、Visual Studio はファイルがロックされていると報告し、上書き \ キャンセルなどを行いました。上書きを選択しましたが、どうやらこれが原因でしたファイルを現在のプロジェクトにコピーするVS。トラブルシューティングの試みはすべて、エディターで開いたローカルの somename.h ファイルで編集されていましたが、コンパイラーは正しいことを行い、上記の場所から .h ファイルをプルダウンしていました。

direnum.hの現在のローカルコピーへの切り替えを削除し、再コンパイルすると、コードの一部がANSIとしてコンパイルされ、他の部分がWCHARとしてコンパイルされたため、これが修正されました

于 2013-12-23T02:47:35.110 に答える