2

私は C++ の初心者なので、これは比較的単純な問題であると確信していますが、ヒープ破損の問題を追跡しようとしている従来の C++ アプリがあり、この関数に追跡しました。

void LTrimZeros(CString *pstr)
{
    char *psz1;
    char *psz2;

    if ( pstr->GetLength() == 0 )
        return;


    psz1 = new char[pstr->GetLength() + 1];
    psz2 = psz1;

    strcpy_s( psz2, strlen(psz2), (const char *) *pstr );

    while ( *psz2 == '0' )
    {
        psz2++;
    }

    *pstr = psz2;

    delete [] psz1;

    return;
}

削除しようとするpsz1と、ヒープ破損エラーがスローされます。繰り返しますが、私は C++ にかなり慣れていないので、これを修正して誤ってメモリ リークを引き起こしたくなかったので、専門家に尋ねてみようと思いました。このアプリはもともと c++4 のように記述されていましたが、現在は c++11 にアップグレードされているため、同じ関数の代替ソリューションも問題ありません (これがヒープの破損を引き起こす理由の簡単な説明も非常に役立ちます)。

4

2 に答える 2

3

strlen(psz2)初期化されていないメモリを読み取っているため、配列の終わりを超えて読み取る可能性があります。これは、 に渡す長さstrcpy_sが予測できず、 に割り当てられたメモリの最後を超えて書き込む可能性があることを意味しますpsz1

関数の最後が有効であると仮定すると (私はCStringに十分に慣れていないため、確実に言うことができません)、単純にstrcpy_s行を次のように変更できます。

strcpy_s( psz2, pstr->GetLength() + 1, (const char *) *pstr );

UNICODEここで、との_UNICODE定義に応じて 8 ビット文字と 16 ビット文字を切り替える win32 文字列処理関数で問題が発生する可能性があります。私は Alok Save やその他のユーザーの意見に同意しますstd::string

于 2013-04-22T15:19:32.540 に答える