gpt4 book ai didi

c++ - C中数据的功能责任

转载 作者:行者123 更新时间:2023-11-30 17:09:13 25 4
gpt4 key购买 nike

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

  • 创建 fd
  • 的函数
  • 读/写时遇到错误的函数

  • 是否有针对此类情况的设计规则;让我们说创建和清理。

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

    最佳答案

    这个答案有两个部分——一般设计问题和适合您情况的详细机制。

    一般设计

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

    您的标签使用 C 和 C++;请注意,C++ 有额外的可用机制。

    在 C++ 中,RAII — Resource Acquisition Is Initialization — 习语有很大帮助。当您获取资源时,请确保获取资源的任何内容都会初始化一个将被正确销毁并在销毁时释放资源的值。

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

    在评论中,我写道:

    Generally, the function that opened the file should close it; the function that experienced the error should report the error, but not close the file. However, you can work it how you like as long as the contract is documented and enforced — the calling code needs to know when the called code closed the file to avoid double closes.



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

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

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

    详细的机制

    你确定你使用的是文件描述符而不是 FILE * (文件流)?两次关闭文件描述符不太可能导致崩溃(错误,是的,但不是崩溃)。 OTOH,调用 fclose()在已经关闭的文件流上可能会导致问题。

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

    您可以通过将文件描述符设置为 -1 来使其无效。 ;那永远不是有效的文件描述符。使用 0是个坏主意;它相当于使用标准输入。您可以通过将文件流设置为 0 来使其无效。 (又名 NULL)。将空指针传递给尝试使用文件流的函数往往会导致崩溃。传递无效的文件描述符通常不会导致崩溃 — 调用可能会失败并显示 EBADF设置在 errno ,但这通常是伤害的极限。

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

    关于c++ - C中数据的功能责任,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33355534/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com