主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

关闭之前已关闭的资源

函数关闭先前关闭的流

描述

当函数尝试关闭代码中之前已关闭且未重新打开的流时,会发生此错误。

风险

该标准规定,在关闭与 FILE* 指针相关的流后,该指针的值将不确定。再次对 FILE* 指针执行关闭操作可能会导致意外行为。

修复

删除多余的关闭操作。

示例

全部展开

#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data)
            fputc(*data,fp);
        else
            fclose(fp);
    }
    fclose(fp);
}

在此示例中,如果 fp 不是 NULL,并且 dataNULL,则 fclose 操作将连续两次发生在 fp 上。

更正 - 移除关闭操作

一种可能的更正是删除最后一个 fclose 操作。为了避免资源泄漏,您还必须在 if(data) 模块中放置一个 fclose 操作。

#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data) {
            fputc(*data,fp);
            fclose(fp);
        }
        else
            fclose(fp);
    }
}

结果信息

组:资源管理
语言:C | C++
默认值:手写代码时为启动,生成代码时为关闭
命令行语法:DOUBLE_RESOURCE_CLOSE
影响

版本历史记录

在 R2015b 中推出