我的课程结构如下:
class Server
{
private:
SOCKET listener;
public:
Server(char const * const address, unsigned short int port);
~Server();
void Start();
};
如果delete
方法在调用Start
或CreateIoCompletionPort
期间抛出异常,是否可以依赖该库的用户listen
该对象? ?
我知道有点主观,但这种情况是否有最好的做法?
我希望避免重复清理代码,并可能导致双重释放资源的问题,以及还需要跟踪清理过的内容和不清除内容的复杂性。
修改
要清除一些问题,我指的是我的代码的用户何时会创建Server
类的实例。我试图决定是否应该保护类在由于Start
中遇到异常而处于无效状态时执行的路径。如果Start
方法由于某些问题而失败,那么它是一个不可恢复的错误,并且该类处于错误状态并且无法继续进行。这可能类似于配置错误或系统级错误,导致Start
无法成功,但同时使SOCKET
处于无法关闭和创建时无法恢复的状态一个新的插座。
答案 0 :(得分:4)
期望程序员记住删除他分配的所有内容是完全不合理的,特别是在存在异常的情况下:人类可以记住多少是有限的,并且在一个足够大的系统中你会遇到这种情况很快就限制了。
然而,删除所有内容是他必须做的,以避免内存泄漏。为了取得任何成功,程序员需要做两件事:
第一部分是预防;第二部分是"安全网"。如果您对使用智能指针和运行单元测试有规定,那么您的代码在基本级别将是exception-safe(即它将提供无泄漏保证)。您可以更进一步,预先进行分配,只有在所有分配成功实现事务语义以实现强异常安全时才更改状态。