检测到堆损坏:正常块之后... CRT 检测到应用程序在堆缓冲区结束后写入内存
HEAP CORRUPTION DETECTED: after normal block... CRT detected that the application worte to memory after end of heap buffer
当我 运行 这段代码时,我得到了标题中的错误,这是一个准确的屏幕截图:
我的代码是这样的:
string ProcessCommand(vector<unsigned char> data)
{
try
{
int valread = data.size();
unsigned char* converted = &data[0];
char *buffer = (char *)converted;
buffer[valread] = '[=10=]';
const char file[] = ">myfile.txt";
char * newBuffer = new char[strlen(buffer) + strlen(file) + 1];
strcpy(newBuffer, buffer);
strcat(newBuffer, file);
system(newBuffer);
fstream f("myfile.txt", fstream::in);
string str;
getline(f, str, '[=10=]');
//const char * sendfile = str.c_str();
//char * result;
//result = const_cast<char *>(sendfile);
f.close();
remove("myfile.txt");
return str;
}
catch (const std::exception&)
{
}
}
buffer[valread] = '[=10=]';
正在尝试访问 buffer
中不存在的元素。因此,程序行为未定义。
如果您使用 data.at(valread)
而不是,那么会抛出 std::exception
(并在您的 catch
站点拦截),这是 C++11 标准所要求的。
还可以考虑对所有连接使用 std::string
的 +
重载。如果这样做,您的代码将更具可读性。对 newBuffer
使用 std::string
类型(具有自动存储持续时间)。您始终可以使用 c_str()
以只读方式访问内部数据缓冲区。
当我 运行 这段代码时,我得到了标题中的错误,这是一个准确的屏幕截图:
我的代码是这样的:
string ProcessCommand(vector<unsigned char> data)
{
try
{
int valread = data.size();
unsigned char* converted = &data[0];
char *buffer = (char *)converted;
buffer[valread] = '[=10=]';
const char file[] = ">myfile.txt";
char * newBuffer = new char[strlen(buffer) + strlen(file) + 1];
strcpy(newBuffer, buffer);
strcat(newBuffer, file);
system(newBuffer);
fstream f("myfile.txt", fstream::in);
string str;
getline(f, str, '[=10=]');
//const char * sendfile = str.c_str();
//char * result;
//result = const_cast<char *>(sendfile);
f.close();
remove("myfile.txt");
return str;
}
catch (const std::exception&)
{
}
}
buffer[valread] = '[=10=]';
正在尝试访问 buffer
中不存在的元素。因此,程序行为未定义。
如果您使用 data.at(valread)
而不是,那么会抛出 std::exception
(并在您的 catch
站点拦截),这是 C++11 标准所要求的。
还可以考虑对所有连接使用 std::string
的 +
重载。如果这样做,您的代码将更具可读性。对 newBuffer
使用 std::string
类型(具有自动存储持续时间)。您始终可以使用 c_str()
以只读方式访问内部数据缓冲区。