期望程序员在引发异常后删除对象是否合理?
Is it reasonable to expect a programmer to delete an object after an exception is thrown?
>我有一个结构如下的类:
class Server
{
private:
SOCKET listener;
public:
Server(char const * const address, unsigned short int port);
~Server();
void Start();
};
如果 Start
方法在调用 CreateIoCompletionPort
或 listen
期间引发异常,是否有替代方法可以依赖库的用户来delete
对象?
我知道有点主观,但是对于这种情况有最佳实践吗?
我希望避免重复清理代码,并可能导致双重释放资源的问题,以及还必须跟踪已清理和未清理的内容的复杂性。
编辑
为了澄清提出的一些问题,我指的是我的代码用户何时将创建Server
类的实例。我正在尝试决定是否应该采取保护类在由于Start
中遇到异常而处于无效状态时免于执行的路线。如果 Start
方法由于某些问题而失败,则这是一个不可恢复的错误,并且类处于错误状态,无法继续操作。这将类似于配置错误或系统级错误,阻止Start
成功,但同时使SOCKET
处于无法在不关闭和创建新套接字的情况下还原的状态。
期望程序员记住删除他分配的所有内容是完全不合理的,尤其是在存在异常的情况下:一个人可以记住多少是有限制的,在一个足够大的系统中,你很快就会遇到这个限制。
但是,删除所有内容是他必须做的,以避免内存泄漏。为了取得任何程度的成功,程序员需要做两件事:
- 遵循防御性编码做法 - 首选在自动存储中分配的对象而不是指针。当必须动态分配对象时,请使用智能指针。坚持 RAII 技术。
- 编写详尽的单元测试,并分析内存泄漏 - 使用内存探查器可帮助您发现否则难以发现的泄漏。
预防;第二部分是"安全网"。如果你在使用智能指针和运行单元测试方面有纪律,那么你的代码在基本级别将是异常安全的(即它将提供无泄漏保证)。您可以更进一步,预先进行分配,并且仅在所有分配都成功实现事务语义以实现强大的异常安全性时才更改状态。
相关文章:
- 是否需要删除包含对象的"pair"?
- 是否删除在对象构造过程中创建的对象
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在这种情况下,java对象是否可以调用本机函数
- 返回指向对象的指针的函数调用是否为 prvalue?
- 具有引用成员的结构是否具有唯一的对象表示形式
- 对象初始化中是否允许指向此成员的指针?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 堆分配的对象是否存在永不为空的唯一所有者?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- QFileSystemModel 对象是否会被删除?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 类对象在 c++ 中是否具有数据类型?
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?