【发布时间】:2014-05-19 09:41:32
【问题描述】:
我有这部分代码:
class CNuovoVocabolo {
CString m_strItaliano;
CString m_strRusso;
//...
}
void CNuovoVocabolo::GetVocabolo( CVocabolo* pVocabolo )
{
int nLIta;
int nLRus;
wchar_t *pIta;
wchar_t *pRus;
nLIta = m_strItaliano.GetLength();
nLRus = m_strRusso.GetLength();
if( nLIta > 0 && nLRus > 0 )
{
pIta = new wchar_t[nLIta + 1];
wcscpy_s( pIta, nLIta * sizeof( wchar_t ), m_strItaliano );
pRus = new wchar_t[nLRus + 1];
wcscpy_s( pRus, nLRus * sizeof( wchar_t ), m_strRusso );
pVocabolo->SetVocabolo( pIta, nLIta, pRus, nLRus );
delete [] pIta; // *1
delete [] pRus; // *2
}
}
// Inside CVocabolo::SetVocabolo:
void CVocabolo::SetVocabolo( const wchar_t* pIta/*=NULL*/, unsigned short nLIta/*=0*/, const wchar_t* pRus/*=NULL*/, unsigned short nLRus/*=0*/ )
{
if( pIta != NULL && pRus != NULL && nLIta > 0 && nLRus > 0 )
{
AzzeraVocabolo();
m_nLIta = nLIta;
m_nLRus = nLRus;
m_pItaliano = new wchar_t[nLIta + 1];
wcscpy_s( m_pItaliano, nLIta * sizeof( wchar_t ), pIta );
m_pRusso = new wchar_t[nLRus + 1];
wcscpy_s( m_pRusso, nLRus * sizeof( wchar_t ), pRus );
}
}
当我删除 *1 和 *2 处的 pIta 指针和 pRus 指针时,由于堆损坏而崩溃。老实说,我不明白为什么会发生这种情况以及我做错了什么。有什么建议吗?
编辑:
上网查了一下,找到了解决办法:
pIta = new wchar_t[( nLIta + 1 ) * sizeof( wchar_t )];
但老实说,我还不清楚。如果你能给我一个解释... 另外,知道这个问题为什么被否决也很好。
【问题讨论】:
-
wcscpy_s 看起来很可疑,尤其是乘以 sizeof (wchar_t)。
-
一个好的开始是停止在堆上使用指针和动态分配,并开始使用
std::wstring。 -
wcs_cpy_s的秒参数是numberOfElements,而不是字节。所以不需要乘法。 -
@ivangrynko 不使用 * sizeof( wchar_t ) 会导致 Buffer too small 异常。
标签: c++ mfc heap-corruption