我不是c ++专家,所以我想知道是否有人可以向我解释这段代码出了什么问题。当它删除[] str时我得到一个错误
HEAP CORRUPTION DETECTED。 CRT检测到应用程序在堆缓冲区结束后写入内存。
这似乎告诉我,我的缓冲区不够大,但我不明白为什么。
char* foo()
{
std::string s = "01";
char* buffer = new char[s.size()+1];
strncpy_s(buffer, sizeof(buffer), s.c_str(), s.size());
buffer[s.size()] = '\0';
return buffer;
}
int main()
{
char* str = foo()
for (int i = 0; i < strlen(str); ++i)
{
std::cout << str[i];
}
delete[] str;
std::getchar();
return 0;
}
答案 0 :(得分:1)
好吧我好像已经修好了。 sizeof(缓冲区)只返回4个字节(指针I&#39;猜测的大小)。将其更改为缓冲区中的字符数似乎已经奏效。
strncpy_s(buffer, s.size() + 1, s.c_str(), s.size());
答案 1 :(得分:1)
sizeof(buffer)
只返回指针的大小,而不是它指向的缓冲区的大小。缓冲区的正确大小为:
const auto bufSize = sizeof( *buffer ) * (s.size() + 1);
或者,更简单一点:
const auto bufSize = sizeof( char ) * (s.size() + 1);
正确的字符串副本如下所示:
strncpy_s(buffer, bufSize, s.c_str(), s.size());