Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C语言中的数据函数_C++_C - Fatal编程技术网

C++ C语言中的数据函数

C++ C语言中的数据函数,c++,c,C++,C,最近我在工作中遇到了一个问题,你有两个功能;打开一个文件描述符(它是函数中的局部变量),并将其传递给另一个函数,在该函数中用于读取或写入。现在,当其中一个读/写操作失败时,执行读/写操作的函数将关闭此文件描述符并返回。 问题是,谁的责任是关闭文件描述符,或者说执行清理: 创建fd的函数 读/写时发生错误的函数 这类案例是否有设计规则;比如说创建和清理 顺便说一句,问题是两个函数都试图关闭fd,这导致第二次调用关闭时崩溃。这个答案有两个部分-一般设计问题和针对您情况的详细机制 总体设计 正确处理文

最近我在工作中遇到了一个问题,你有两个功能;打开一个文件描述符(它是函数中的局部变量),并将其传递给另一个函数,在该函数中用于读取或写入。现在,当其中一个读/写操作失败时,执行读/写操作的函数将关闭此文件描述符并返回。 问题是,谁的责任是关闭文件描述符,或者说执行清理:

  • 创建fd的函数

  • 读/写时发生错误的函数

  • 这类案例是否有设计规则;比如说创建和清理


    顺便说一句,问题是两个函数都试图关闭fd,这导致第二次调用关闭时崩溃。

    这个答案有两个部分-一般设计问题和针对您情况的详细机制

    总体设计 正确处理文件描述符之类的资源,并确保它们被正确释放,这是一个重要的设计问题。有多种方法可以管理有效的问题。还有一些人没有

    <>你的标签使用C和C++;请注意C++有额外的可用机制。 在C++中,RAI-资源获取是初始化-成语是一个很大的帮助。获取资源时,确保获取资源的任何对象都会初始化一个值,该值将被正确销毁,并在销毁时释放资源

    在这两种语言中,通常最好是负责分配资源的函数也释放资源。如果函数打开一个文件,它应该关闭它。如果给函数一个打开的文件,它不应该关闭该文件

    在评论中,我写道:


    通常,打开文件的函数应该将其关闭;发生错误的函数应报告错误,但不关闭文件。但是,只要契约被记录并强制执行,您就可以随心所欲地使用它——调用代码需要知道被调用代码何时关闭文件,以避免双重关闭

    对于被调用函数来说,有时关闭文件(出错时),而不是其他时间(无错误)通常是一种糟糕的设计。如果必须这样做,那么通知调用函数文件已关闭是至关重要的;被调用函数必须返回一个错误指示,告诉调用代码该文件不再有效,不应使用或关闭。只要信息被传递和处理,就不会有问题——但是函数更难使用

    请注意,如果函数设计为返回打开的资源(该函数负责打开文件并使其可供调用该文件的函数使用),则关闭文件的责任落在调用打开函数的代码上。这是一个合法的设计;您只需确保有一个函数知道如何关闭它,并且调用代码确实关闭了它

    类似的注释适用于内存分配。如果函数分配内存,则必须知道何时释放内存,并确保释放内存。如果它是为当前函数及其调用的函数而分配的,那么在返回之前应该释放内存。如果分配给调用函数使用,则释放的责任转移给调用函数

    详细力学 您确定使用的是文件描述符,而不是
    文件*
    (文件流)?关闭文件描述符两次不太可能导致崩溃(错误,是的,但不是崩溃)。OTOH,对已关闭的文件流调用
    fclose()
    ,可能会导致问题

    通常,在C语言中,您通过值传递文件描述符,它是一个小整数,因此无法告诉调用函数文件描述符不再有效。在C++中,可以通过引用传递它们,尽管这样做并不常规。与
    文件类似*
    ;它们通常是通过值传递的,而不是通过引用传递的,因此无法通过修改传递给函数的值来告诉调用代码文件不再可用

    通过将文件描述符设置为
    -1
    ,可以使其无效;这永远不是有效的文件描述符。使用
    0
    是个坏主意;这相当于使用标准输入。通过将文件流设置为
    0
    (又称
    NULL
    ),可以使文件流无效。将空指针传递给尝试使用文件流的函数将导致崩溃。传递无效的文件描述符通常不会导致崩溃-如果在
    errno
    中设置了
    EBADF
    ,调用可能会失败,但这通常是损坏的限制


    使用文件描述符,很少会发生崩溃,因为文件描述符不再有效。使用文件流时,如果您尝试使用无效的文件流指针,各种事情都可能出错。

    只要将其写入在任何给定时间拥有文件句柄所有权的函数的契约中即可。PS:你使用C还是C++?如果你必须从一个函数传递到<代码> fd<代码>,并且任何一个都可以关闭它,只要把它设置为null。在使用
    fclose
    之前,不要忘记先进行测试。但最简单的方法可能是避免这个问题——如果发生错误,为什么要关闭函数中的文件?即使你喜欢这样,如果它确实出错了,为什么不把它传回给调用者呢?@Jongware:文件描述符是小(ish)整数;设置为NULL是不合适的,但是-1可能是合理的。此外,文件描述符很少作为指向
    int
    的指针传递,因此调用代码中很少反映更改。通常,打开文件的函数应该关闭它;遇到错误的函数应该