程序中不同位置的随机堆损坏错误

时间:2017-09-11 16:14:28

标签: visual-c++

运行我的应用程序时,我在程序中的不同位置出现堆损坏错误。有时它运行良好,有时会产生错误。我怀疑它在我的代码中某处使用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*阵列引起的,但我不知道如何。

1 个答案:

答案 0 :(得分:0)

导致堆损坏的一个常见错误是内存覆盖。意思是写在内存上,预计会被其他成员使用。

例如,您创建了10个字节的缓冲区长度,但在该缓冲区上写入了20个字节。

我在你的程序中询问一行可能是根本原因:

::GetWindowTextA(m_pEditDesc->m_pEdit->m_hWnd, (LPSTR)arrDesc, nLength + 1);

尚未为arrDesc分配缓冲区。因此,GetWindowTextA的返回值将被复制到未定义的内存位置。