gpt4 book ai didi

c++ - delete[] 触发断点

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:11 26 4
gpt4 key购买 nike

这是我的示例代码:

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);

删除指针时检测到堆损坏。

编辑:

我想我也应该分配带有 +1 的 corepath 来存储结尾的\0,对吗?

最佳答案

您没有分配足够的空间来包含终止零。对 wcscat_s 的最后一次调用将在 corepath 指向的缓冲区末尾之外写入 '\0'

您还向 wcscat_s 撒谎了缓冲区的容量。容量为 wcslen(envpath) + wcslen(dir) + wcslen(core),但您传递的是 wcslen(corepath) + wcslen(core) + 1

您还在 corepath 初始化之前调用了 wcslen(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);
}

关于c++ - delete[] 触发断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17810918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com