A「;free():无效的下一个大小(快速)";在C++; 我刚遇到了 For():编写C++程序时,出现了下一个大小(快)问题。我没能弄明白为什么会不幸发生这种事。代码如下所示 bool not_corrupt(struct packet *pkt, int size) { if (!size) return false; bool result = true; char *exp_checksum = (char*)malloc(size * sizeof(char)); char *rec_checksum = (char*)malloc(size * sizeof(char)); char *rec_data = (char*)malloc(size * sizeof(char)); //memcpy(rec_checksum, pkt->data+HEADER_SIZE+SEQ_SIZE+DATA_SIZE, size); //memcpy(rec_data, pkt->data+HEADER_SIZE+SEQ_SIZE, size); for (int i = 0; i < size; i++) { rec_checksum[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+DATA_SIZE+i]; rec_data[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+i]; } do_checksum(exp_checksum, rec_data, DATA_SIZE); for (int i = 0; i < size; i++) { if (exp_checksum[i] != rec_checksum[i]) { result = false; break; } } free(exp_checksum); free(rec_checksum); free(rec_data); return result; }
使用的结构是:A「;free():无效的下一个大小(快速)";在C++; 我刚遇到了 For():编写C++程序时,出现了下一个大小(快)问题。我没能弄明白为什么会不幸发生这种事。代码如下所示 bool not_corrupt(struct packet *pkt, int size) { if (!size) return false; bool result = true; char *exp_checksum = (char*)malloc(size * sizeof(char)); char *rec_checksum = (char*)malloc(size * sizeof(char)); char *rec_data = (char*)malloc(size * sizeof(char)); //memcpy(rec_checksum, pkt->data+HEADER_SIZE+SEQ_SIZE+DATA_SIZE, size); //memcpy(rec_data, pkt->data+HEADER_SIZE+SEQ_SIZE, size); for (int i = 0; i < size; i++) { rec_checksum[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+DATA_SIZE+i]; rec_data[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+i]; } do_checksum(exp_checksum, rec_data, DATA_SIZE); for (int i = 0; i < size; i++) { if (exp_checksum[i] != rec_checksum[i]) { result = false; break; } } free(exp_checksum); free(rec_checksum); free(rec_data); return result; },c++,memory,malloc,free,C++,Memory,Malloc,Free,使用的结构是: struct packet { char data[RDT_PKTSIZE]; }; 这段代码并不是每次都出错。它会在free()中崩溃:无效的下一个大小(快速)有时在free中(exp\u校验和)零件 更糟糕的是,有时rec\u checksum中的内容并不等于pkt->data[HEADER\u SIZE+SEQ\u SIZE+data\u SIZE]中的内容,根据调试工具中的监视表达式,它们应该是相同的。使用了memcpy和for方法,但这个问题仍然存在 我不太明
struct packet {
char data[RDT_PKTSIZE];
};
这段代码并不是每次都出错。它会在free()中崩溃:无效的下一个大小(快速)
有时在free中(exp\u校验和)代码>零件
更糟糕的是,有时rec\u checksum
中的内容并不等于pkt->data[HEADER\u SIZE+SEQ\u SIZE+data\u SIZE]
中的内容,根据调试工具中的监视表达式,它们应该是相同的。使用了memcpy
和for
方法,但这个问题仍然存在
我不太明白为什么会这样。如果有人能向我解释这一点,我将不胜感激
编辑:
下面是do_checksum()方法,它非常简单:
void do_checksum(char* checksum, char* data, int size)
{
for (int i = 0; i < size; i++)
{
checksum[i] = ~data[i];
}
}
void do_校验和(字符*校验和,字符*数据,整数大小)
{
对于(int i=0;i
编辑2:
谢谢大家
我将代码的其他部分从使用STL队列切换到STL向量,结果变得很酷
但我还是不明白为什么。我确信我永远不会出现空队列。你试过了吗
另外,确保发送到not\u corrupt()
你试过了吗
另外,确保发送到not\u corrupt()
您报告的错误表明堆已损坏。这些可能很难找到,像valgrind这样的工具可能非常有用。堆损坏通常很难用简单的调试器进行调试,因为运行时错误通常发生在实际损坏之后很长时间
也就是说,考虑到目前发布的代码,堆损坏最明显的潜在原因是DATA\u SIZE
大于SIZE
。如果发生这种情况,则do\u checksum
将写入exp\u checksum
的末尾之外。您报告的错误表明堆已损坏。这些可能很难找到,像valgrind这样的工具可能非常有用。堆损坏通常很难用简单的调试器进行调试,因为运行时错误通常发生在实际损坏之后很长时间
也就是说,考虑到目前发布的代码,堆损坏最明显的潜在原因是DATA\u SIZE
大于SIZE
。如果出现这种情况,则do\u checksum
将在exp\u checksum
的末尾之外写入三个即时建议:
检查大小=数据大小
检查malloc是否返回NULL
三项直接建议:
检查大小=数据大小
检查malloc是否返回NULL
Valgrind很好。。。但验证所有输入和检查所有错误条件更好
在调试器中单步执行代码也不是一个坏主意
我也会称之为“do_校验和(大小)”(您的实际大小),而不是数据大小(大概是“最大大小”)。Valgrind很好。。。但验证所有输入和检查所有错误条件更好
在调试器中单步执行代码也不是一个坏主意
我也会称之为“do_校验和(大小)”(您的实际大小),而不是数据大小(大概是“最大大小”)
DATA_SIZE是一个宏,在我的程序中定义了最大长度,因此
应小于数据大小
即使这是真的,您的逻辑也只能创建足够的内存来容纳大小
字符。
所以你应该打电话
do_checksum(exp_checksum, rec_data, size);
而且,如果您不想使用std::string
(这很好),在使用C时,您应该从malloc/free
切换到new/delete
++
DATA_SIZE是一个宏,在我的程序中定义了最大长度,因此
应小于数据大小
即使这是真的,您的逻辑也只能创建足够的内存来容纳大小
字符。
所以你应该打电话
do_checksum(exp_checksum, rec_data, size);
而且,如果您不想使用std::string
(这很好),在谈论C++1时,您应该从malloc/free
切换到new/delete
。这是C还是C++?2.你在腐蚀你的堆。搜索无效的内存访问。使用valgrind之类的调试工具提供帮助。堆损坏可能在代码的不同部分。你试过在Valgrind下运行代码吗?为什么使用<代码>免费< /代码>哦,为什么不使用<代码> STD::String < /Cord>?@ DaviHeffern?实际上它是C++文件,虽然我写得像C.一样。我不熟悉Valgrind,但我可以试一试。谢谢。你能把do_校验和的代码贴出来吗。这是C还是C++?2.你在腐蚀你的堆。搜索无效的内存访问。使用valgrind之类的调试工具提供帮助。堆损坏可能在代码的不同部分。你试过在Valgrind下运行代码吗?为什么使用<代码>免费< /代码>哦,为什么不使用<代码> STD::String < /Cord>?@ DaviHeffern?实际上它是C++文件,虽然我写得像C.一样。我不熟悉Valgrind,但我可以试一试。谢谢。你能帮我发一下do_校验和的代码吗?我还没有试过(事实上,我直到几分钟前才知道这个工具),但我想稍后再试。保证大小小于数据大小。然而,这个判断应该在我的代码中。感谢您的建议。“大小保证小于数据大小”。这就是你的腐败!看看我的答案。我还没有试过(事实上,我直到几分钟前才知道这个工具),但我想晚一点再试试
do_checksum(exp_checksum, rec_data, size);