无法释放C中循环外的指针



HI我试图从输入文件中读取一些数据,并将它们构造为一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。然而,当运行带有"valgrind"的程序来检查内存泄漏时,内存在malloc内存的行I处泄漏。我尝试在循环外释放它们,如下所示,但编译器无法识别p:"error: 'p' undeclared (first use in this function)"。如果我在while循环内释放它们,我将出现Segmentation错误。我该怎么办?谢谢

  1. 就像错误消息所说的那样,在循环之后使用一个名为p的变量,但代码中唯一名为p的变量只存在于循环中。这可以通过解决下一个问题来解决。

  2. 您分配了多个数据包和有效载荷,但您尝试释放其中的一个。解除分配应该在循环中。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet *p = malloc(sizeof(struct packet));
    p->payload = malloc(sizeof(nread+1));
    p->payload = buff;
    ...
    free(p);
    free(p->payload);
    }
    
  3. 释放后使用*p。您的free调用顺序错误。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet *p = malloc(sizeof(struct packet));
    p->payload = malloc(sizeof(nread+1));
    p->payload = buff;
    ...
    free(p->payload);
    free(p);
    }
    
  4. 您的意思是分配nread+1字节,但您分配的是sizeof(nread+1)字节。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet *p = malloc(sizeof(struct packet));
    p->payload = malloc(nread+1);
    p->payload = buff;
    ...
    free(p->payload);
    free(p);
    }
    
  5. 当您调用free(p->payload)时(如果您将其移动到循环的末尾),p->payload不再包含指向您分配的缓冲区的指针,因此free(p->payload)尝试解除分配错误的块。您需要使用另一个变量来跟踪此块。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet *p = malloc(sizeof(struct packet));
    char* payload = malloc(nread+1);
    p->payload = payload;
    p->payload = buff;
    ...
    free(payload);
    free(p);
    }
    
  6. 我很确定您是想分配nread字节,而不是nread+1,因为您可能是想将读取的字节复制到缓冲区中。

  7. 设置后立即覆盖p->payloadp->payload的内存分配和随后的释放似乎完全没有用。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet *p = malloc(sizeof(struct packet));
    p->payload = buff;
    ...
    free(p);
    }
    
  8. 没有理由一次又一次地分配和释放同一块内存。事实上,根本没有理由使用堆。

    while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
    struct packet p;
    p.payload = buff;
    ...
    }
    
  9. 您编写是为了处理包含指针的结构。这不太可能是正确的。

  10. 该结构的所有其他字段都已初始化。这不太可能是正确的。

  11. 您写入p->payload磁盘的p->block_size字节,但p->payload的大小是nread。(实际上,p->block_size是未初始化的内存。)

  12. 您从不向句柄写入有效负载(nread)的大小,这使得代码无法读取您所写的内容。

您没有提供足够的信息来解决最后四个问题。


我认为您正在尝试写带长度前缀的块,其中每个长度前缀是一个字节长,每个

+---+----- ... -----+---+----- ... -----+---+----- ... -----+...
| i |    i bytes    | j |    j bytes    | k |    k bytes    |
+---+----- ... -----+---+----- ... -----+---+----- ... -----+...

如果是,您需要

while ((nread = fread(buffer, sizeof(char), 255, infp)) > 0) {
unsigned char len = (unsigned char)nread;
fwrite(&len, 1, 1, outfp);
fwrite(buffer, 1, nread, outfp);
}

相关内容

  • 没有找到相关文章