weixin_46786407 2023-07-06 13:42 采纳率: 0%
浏览 12

c++ fread crash

fread crash 查找

windows11系统上


    char* buff = NULL;
    std::FILE* file;
    std::string hashValue = "";
    do {
        buff = (char*)malloc(1024);
        if (!buff) {
            printf("malloc memory failed");
            break;
        }
        file = std::fopen(filePath, "rb");
        if (!file) {
            printf("open file failed %s", filePath);
            break;
        }
        size_t len, result;
        while (1) {
            if ((len = std::fread(buff, sizeof(char), 1024, file)) <= 0) {
                break;
            }
            hasher.add(&buff[0], len);
            if ((result = std::fseek(file, 0, SEEK_CUR)) !=
                0) {
                break;
            }
        }

fread crash 有老哥帮忙看看是什么问题

  • 写回答

2条回答 默认 最新

  • 憧憬blog 2023-07-06 13:55
    关注

    在上述代码中,fread 函数的调用可能会导致程序崩溃的原因有以下几种可能:

    1. 内存分配问题:在每次循环开始时,您都会分配一块 1024 字节的内存。如果内存分配失败,malloc 函数会返回 NULL,并且您没有检查 buff 是否为 NULL,就直接使用了 buff 指针,这将导致访问无效内存的错误。因此,您需要在每次分配内存后检查 buff 是否为 NULL,如果是,则应该释放之前分配的内存(如果存在),并退出循环。

    2. 文件读取问题:在读取文件时,您没有检查读取的字节数是否与预期的字节数相同。如果因为文件结尾或者其他原因导致读取的字节数小于预期值,可能会导致 hasher.add 函数访问无效内存,从而引发程序崩溃。因此,您需要在每次读取文件后检查实际读取的字节数,如果小于预期值,则应该退出循环。

    3. 文件操作问题:在每次循环中,您都会调用 fseek 函数,该函数将当前文件位置设置为相对于当前位置的偏移量。如果 fseek 函数调用失败,可能会导致后续的文件读写操作出错。因此,您需要在每次调用 fseek 后检查返回值是否为 0,如果不是,则应该退出循环。

    综上所述,建议您在代码中添加适当的错误处理代码,以确保程序能够正确地处理各种异常情况。同时,建议您使用 C++ 标准库中的 RAII 技术来管理内存和文件句柄,以避免手动管理内存和文件句柄时出现的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月6日

悬赏问题

  • ¥15 关于Lammps建模的描述
  • ¥15 #lingo#请问一下为什么会出现以下情况,是因为l第一个值是0的缘故吗?
  • ¥15 设计格雷码同步八进制计数器
  • ¥100 改写matlab程序(关键词-系统对)
  • ¥15 函数信号发生器仿真电路
  • ¥15 Qt的pixmap和image图片加载都导致程序崩溃怎么办
  • ¥15 Kali木马生成问题求解
  • ¥30 求一下解题思路,完全不懂
  • ¥15 C51单片机串口控制JQ6500语音模块
  • ¥30 想给yolo5模型加一个图片识别界面,但是图片还没有检测出来就闪退了