0

これは私のコード例です:

int main()
{
    const wchar_t *envpath = L"hello\\";
    const wchar_t *dir = L"hello2\\";
    const wchar_t *core = L"hello3";

    wchar_t *corepath = new wchar_t[
        wcslen(envpath) +
        wcslen(dir) +
        wcslen(core)
    ];

    wcscpy_s(corepath, wcslen(corepath) + wcslen(envpath) + 1, envpath);
    wcscat_s(corepath, wcslen(corepath) + wcslen(dir) + 1, dir);
    wcscat_s(corepath, wcslen(corepath) + wcslen(core) + 1, core);

    delete []corepath;
    return 0;
}

コマンドで、delete []corepathブレークポイントがトリガーされます。
原因は何ですか?

また、このようにコードを書き直すと:

    wcscpy_s(corepath, wcslen(envpath) + 1, envpath);
    wcscat_s(corepath, wcslen(corepath) + wcslen(dir) + 1, dir);
    wcscat_s(corepath, wcslen(corepath) + wcslen(core) + 1, core);

ポインタの削除時にヒープの破損が検出されました。

編集:

末尾の \0 を格納するには、コアパスも +1 で割り当てるべきだと思いますよね?

4

1 に答える 1

5

終端のゼロを含めるのに十分なスペースを割り当てていません。への最後の呼び出しは、 が指すバッファの終わりを超えてwcscat_s書き込みます。'\0'corepath

wcscat_sまた、バッファの容量について嘘をついています。定員は ですが、代わりにwcslen(envpath) + wcslen(dir) + wcslen(core)合格しています。wcslen(corepath) + wcslen(core) + 1

wcslen(corepath)また、初期化される前に呼び出しcorepathています。

修正されたコードは次のようになります。

int main()
{
    const wchar_t *envpath = L"hello\\";
    const wchar_t *dir = L"hello2\\";
    const wchar_t *core = L"hello3";

    size_t cap = wcslen(envpath) +
        wcslen(dir) +
        wcslen(core) + 1;

    wchar_t *corepath = new wchar_t[cap];

    wcscpy_s(corepath, cap, envpath);
    wcscat_s(corepath, cap, dir);
    wcscat_s(corepath, cap, core);

    delete[] corepath;
    return 0;
}

実際には、修正されたコードは次のようになります。

#include <string>
int main()
{
    const wchar_t *envpath = L"hello\\";
    const wchar_t *dir = L"hello2\\";
    const wchar_t *core = L"hello3";

    std::wstring corepath = envpath;
    corepath.append(dir);
    corepath.append(core);
}
于 2013-07-23T13:14:12.857 に答える