我继承了一些用MFC C ++编写的部分开发的10年代码。我的任务是更新和完成应用程序。
在CDialogChild类中,它在.h文件中显示如下:
private:
static const int m_iDefaultDesktopSizeX = 1024;
static const int m_iDefaultDesktopSizeY = 740;
我仍在试图找出代码及其背后的逻辑,但我决定动态地获得分辨率。我删除了"静态"来自.h的关键字以及幻数,然后我尝试在构造函数的初始化列表中定义它们:
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调试器中获得的数字各不相同,而且#34;无法访问内存"以数百万计的数字。
然后我决定尝试在构造函数中初始化它们而不是初始化列表。我删除了" 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
当我运行它时,&#34; ss2&gt;&gt;会抛出异常。 SRC2&#34;说访问违规写入[十六进制地址]
那么,发生了什么以及我应该提供更多信息?我遇到的问题是在我对另一个问题进行故障排除时,所以对其中一个或两个的帮助都很棒!
修改
感谢Mark的评论,我将所有LPTSTR变量的初始化更改为&#34; new TCHAR()&#34;,它修复了该特定问题。我能够在调试输出中运行该字符串,它显示了正确的分辨率(即使它在VS调试器本身中是错误的),所以非常感谢!即使我将变量放回到构造函数初始化列表中并使它们成为&#34; const&#34;再次:))
但是,我现在收到一个新错误。虽然这最终不是它在#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;
当运行时到达delete命令并且.exe文件触发了断点时发生错误。
答案 0 :(得分:4)
错误很可能是由代码中的缓冲区溢出引起的,如下所示:
LPTSTR dest = new TCHAR();
StringCchCat(dest, 300, _T("\nm_iDefaultDesktopSizeX = "));
第一行分配一个字符,然后在第二行写入大约20-30个字符。
不要使用原始字符串指针,只需使用CString或std :: wstring:
tstringstream ss1;
tstringstream ss2;
ss1 << m_iDefaultDesktopSizeX;
ss2 << m_iDefaultDesktopSizeY;
CString dest = _T("\nm_iDefaultDesktopSizeX = ");
dest += ss1.str().c_str();
dest += _T(" and m_iDefaultDesktopSizeY = ");
dest += ss2.str().c_str();
OutputDebugString(dest);