运行我的应用程序时,我在程序中的不同位置出现堆损坏错误。有时它运行良好,有时会产生错误。我怀疑它在我的代码中某处使用char*
并使用new运算符初始化它。
我尝试过谷歌搜索,它没有提出任何建议。我尝试使用Windows的调试工具,但这都是徒劳的,因为我不知道如何使用该工具。以下是我的代码示例。
void CItemEditWnd::OnSubmit()
{
CConnection conn;
if(conn.Open())
{
char* arrDesc = new char;
char* arrUnitID = new char;
char* arrSubheadingID = new char;
int nLength = ::GetWindowTextLengthA(m_pEditDesc->m_pEdit->m_hWnd);
::GetWindowTextA(m_pEditDesc->m_pEdit->m_hWnd, (LPSTR)arrDesc, nLength + 1);
if(arrDesc == "")
{
AfxMessageBox(_T("No description "));
return;
}
if(m_pComboUnit->m_pRowItem != NULL)
{
ASSERT_VALID(m_pComboUnit->m_pRowItem);
auto iterUnitID = std::next(m_pComboUnit->m_pRowItem->m_lstColumns.begin(),0);
arrUnitID = (*iterUnitID);
}
else
{
AfxMessageBox(_T("No Unit"));
return;
}
if(m_pComboSubheading->m_pRowItem != NULL)
{
ASSERT_VALID(m_pComboSubheading->m_pRowItem);
auto iterSubheadingID = std::next(m_pComboSubheading->m_pRowItem->m_lstColumns.begin(),0);
arrSubheadingID = (*iterSubheadingID);
if(m_nID > -1)
{
std::string str = std::to_string((long long)m_nID);
conn.UpdateItem(str.data(), arrDesc, arrUnitID, arrSubheadingID);
}
else
{
conn.InsertItem(arrDesc, arrUnitID, arrSubheadingID);
}
}
else
{
if(m_nID > -1)
{
std::string str = std::to_string((long long)m_nID);
conn.UpdateItem(str.data(), arrDesc, arrUnitID);
}
else
{
conn.InsertItem(arrDesc, arrUnitID);
}
}
Clear();
conn.Close();
::SendMessage(GetParent()->GetParent()->m_hWnd, WM_LOADTABLEDATA, (WPARAM)ID_ITEMSTABLE,0);
}
else
{
AfxMessageBox(_T("Could not open database "));
}
}
我知道代码有点混乱,但我怀疑腐败是由char*
阵列引起的,但我不知道如何。
答案 0 :(得分:0)
导致堆损坏的一个常见错误是内存覆盖。意思是写在内存上,预计会被其他成员使用。
例如,您创建了10个字节的缓冲区长度,但在该缓冲区上写入了20个字节。
我在你的程序中询问一行可能是根本原因:
::GetWindowTextA(m_pEditDesc->m_pEdit->m_hWnd, (LPSTR)arrDesc, nLength + 1);
尚未为arrDesc
分配缓冲区。因此,GetWindowTextA
的返回值将被复制到未定义的内存位置。