【发布时间】:2011-09-01 23:09:37
【问题描述】:
我在学习new 之后做了一些研究,与我习惯的malloc() 不同,它不会为失败的分配返回 NULL,并且发现有两种不同的方法来检查 new 是否成功。这两种方式是:
try
{
ptr = new int[1024];
}
catch(std::bad_alloc& exc)
{
assert();
};
和
ptr = new (std::nothrow) int[1024];
if(ptr == NULL)
assert();
我相信这两种方法可以实现相同的目标,(当然,如果我错了,请纠正我!),所以我的问题是:
这是检查new 是否成功的更好选择,完全基于可读性、可维护性和性能,同时忽略事实上的 c++ 编程约定。
【问题讨论】:
-
使用例外。它们使您的代码更有意义、更本地化、可维护和可扩展。
-
只看可读性,绝对是没有异常处理的。关于性能,也许还有
nothrow。但我敢肯定,过度例外论者会争辩。但是如果你只是想要一个简单的断言失败,你也可以使用 throwing 变体并省略异常处理程序;) -
这段代码有什么意义?您正在捕获一个特定的、有意义的异常,然后通过
assert()创建一个无意义的异常... -
我不知道,不好的例子。将 malloc() 用于 C 数组。试图处理 std::bad_alloc() 几乎总是一个错误。它实际上是一个异步异常。当您开始消耗超过一半的地址空间时,是时候考虑切换到 64 位操作系统了。
-
这只是重新散列返回代码与错误报告的异常。
标签: c++ performance exception-handling readability