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