期望程序员在抛出异常后删除对象是否合理?

时间:2014-11-15 01:44:56

标签: c++ winapi

我的课程结构如下:

class Server
{
    private:
    SOCKET listener;

    public:
    Server(char const * const address, unsigned short int port);
    ~Server();
    void Start();
};

如果delete方法在调用StartCreateIoCompletionPort期间抛出异常,是否可以依赖该库的用户listen该对象? ?

我知道有点主观,但这种情况是否有最好的做法?

我希望避免重复清理代码,并可能导致双重释放资源的问题,以及还需要跟踪清理过的内容和不清除内容的复杂性。

修改

要清除一些问题,我指的是我的代码的用户何时会创建Server类的实例。我试图决定是否应该保护类在由于Start中遇到异常而处于无效状态时执行的路径。如果Start方法由于某些问题而失败,那么它是一个不可恢复的错误,并且该类处于错误状态并且无法继续进行。这可能类似于配置错误或系统级错误,导致Start无法成功,但同时使SOCKET处于无法关闭和创建时无法恢复的状态一个新的插座。

1 个答案:

答案 0 :(得分:4)

期望程序员记住删除他分配的所有内容是完全不合理的,特别是在存在异常的情况下:人类可以记住多少是有限的,并且在一个足够大的系统中你会遇到这种情况很快就限制了。

然而,删除所有内容是他必须做的,以避免内存泄漏。为了取得任何成功,程序员需要做两件事:

  • 遵循防御性编码惯例 - 将自动存储中分配的对象更喜欢指针。必须动态分配对象时,请使用智能指针。坚持RAII技术。
  • 编写详尽的单元测试,并对其进行内存泄漏分析 - 使用内存分析器可以帮助您发现难以找到的泄漏。

第一部分是预防;第二部分是"安全网"。如果您对使用智能指针和运行单元测试有规定,那么您的代码在基本级别将是exception-safe(即它将提供无泄漏保证)。您可以更进一步,预先进行分配,只有在所有分配成功实现事务语义以实现强异常安全时才更改状态。