1

私は、MFC C++ で書かれた部分的に開発された 10 年前のコードをいくつか継承しました。私はアプリの更新と完成を任されています。

CDialogChild クラスでは、.h ファイルで次のようになります。

private:
static const int m_iDefaultDesktopSizeX = 1024;

static const int m_iDefaultDesktopSizeY = 740;

私はまだコードとその背後にあるロジックを理解しようとしていますが、解決策を動的に取得することにしました。.h とマジック ナンバーから "static" キーワードを削除し、コンストラクターの初期化リストでそれらを定義しようとしました。

CDialogChild::CDialogChild(CWnd* pParent /*=NULL*/)
: CDialog(CDialogChild::IDD, pParent) , //more variables,
m_iDefaultDesktopSizeX(GetSystemMetrics(SM_CXSCREEN)), m_iDefaultDesktopSizeY(GetSystemMetrics(SM_CYSCREEN))
{
//...
}

私の解像度は 1366x768 です。Visual Studio 2013 デバッガーで得られる数値は、"メモリにアクセスできません" から数百万の数値までさまざまです。

次に、初期化リストではなく、コンストラクターでそれらを初期化することにしました。ヘッダーの「const」キーワードを両方の変数から削除し、デバッグ出力にそれらの値を出力すると考えました。これは私のコードです(それほどエレガントではありませんが、MFCの規則を理解しています):

#ifdef UNICODE
typedef std::wstringstream tstringstream;
#else
typedef std::stringstream tstringstream;
#endif

m_iDefaultDesktopSizeX = GetSystemMetrics(SM_CXSCREEN);
m_iDefaultDesktopSizeY = GetSystemMetrics(SM_CYSCREEN);    

#ifdef OUTPUT_DEBUG_STRING
    tstringstream ss1;
    tstringstream ss2;

    ss1 << m_iDefaultDesktopSizeX;
    //stream >> sizeX;

    ss2 << m_iDefaultDesktopSizeY;

    LPTSTR dest = _T("m_iDefaultDesktopSizeX = ");
    LPTSTR src1 = _T("");
    LPTSTR src2 = _T("");

    ss1 >> src1;
    ss2 >> src2;

    // 1000 is a magic number
    StringCchCat(dest, 1000, src1);
    StringCchCat(dest, 1000, _T(" and m_iDefaultDesktopSizeY = "));
    StringCchCat(dest, 1000, src2);
    OutputDebugString(dest);
#endif

実行すると、「ss2 >> src2」で例外がスローされ、[16 進アドレス] へのアクセス違反書き込みが発生します。

それで、何が起こっていて、さらにどのような情報を提供する必要がありますか? 私が直面している問題は、別の問題のトラブルシューティング中に発生したものです。そのため、どちらかまたは両方のヘルプがあれば素晴らしいです!

編集

Mark のコメントのおかげで、すべての LPTSTR 変数の初期化を「new TCHAR()」に変更し、その特定の問題を修正しました。デバッグ出力で文字列を実行することができました。これは正しい解像度を示していました (VS デバッガー自体では間違っていましたが)。どうもありがとうございました! これは、変数をコンストラクターの初期化リストに戻し、それらを再び「const」にした場合でも機能します:)

ただし、新しいエラーが発生しました。これは最終的にはこの #ifdef ブロックで発生する問題ではありませんが、現在発生しているエラーは、私が書いた他のコードでポップアップする可能性があります。

コード:

tstringstream ss1;
tstringstream ss2;

ss1 << m_iDefaultDesktopSizeX;
//stream >> sizeX;

ss2 << m_iDefaultDesktopSizeY;

LPTSTR dest = new TCHAR();
StringCchCat(dest, 300, _T("\nm_iDefaultDesktopSizeX = "));
LPTSTR src1 = new TCHAR();
LPTSTR src2 = new TCHAR();

ss1 >> src1;
ss2 >> src2;


StringCchCat(dest, 300, src1);
StringCchCat(dest, 300, _T(" and m_iDefaultDesktopSizeY = "));
StringCchCat(dest, 300, src2);
OutputDebugString(dest);

//error happens on the line below this one!!!!
delete dest;
dest = 0;
delete  src1;
src1 = 0;
delete  src2;
src2 = 0;

ランタイムが削除コマンドに達したときにエラーが発生し、.exe ファイルがブレークポイントをトリガーしたことが原因です。

4

1 に答える 1