我想知道如何停止/取消对象的创建,由new()
提升。也许如果某些先决条件失败并且不需要该对象。
new
之前检查?null
或特殊内容,不知道如何处理...... new
成功并且对象存活后检查。调用成员函数myObj->Init()
。如果失败会破坏对象?答案 0 :(得分:14)
以上都不是。
如果由于未满足的条件而无法构造对象,则构造函数应该使用throw
语句抛出异常。
答案 1 :(得分:4)
在
new
之前检查?
如果您的前置条件可以在对象自己的内部范围之外进行验证,并且如果它们在调用范围内在语义上属于,那么确定......这很棒!
在构造函数中检查,返回null或特殊的东西,不知道如何处理......
在构造函数中检查,并抛出异常。像处理任何其他异常一样处理它。 最佳方法。
在
new
成功并且对象存活后检查。调用成员函数myObj->Init()
。如果失败会破坏对象?
以这种方式放弃RAII是向后步骤。
答案 2 :(得分:2)
抛出对象构造函数的异常。请注意,与operator delete
不同,对象的析构函数将不被调用,而{{1}}将自动调用以回收已分配的内存。
答案 3 :(得分:-1)
也许最好使轻量级构造函数始终成功,而初始化函数会导致繁重的工作并在出错时抛出异常。
修改即可。经过一些批评性反馈,我发现为什么我的建议不符合RAII要求: “在初始化期间获取资源,在它们可用之前没有机会被使用”。
我不会更改我的原始帖子,将此作为典型的设计错误示例可能会有所帮助。