当分配器由于内存有限而失败时。该应用程序崩溃了。抛出 bad_alloc 或返回 nullptr 不会停止崩溃。有人知道吗?
pointer allocator<T>(size_type count) const
{
void* buffer = new (count * sizeof(T));
if (!buffer) // if buffer == nullptr crashes app
throw bad_alloc; // doing this crashes app
/* or alternatively
* try {
* void* buffer = new (count * sizeof(T));
* } catch (const std::exception& e) {
* std::cerr << "failed to allocate " << count << std::endl;
* return nullptr;
* }
*/
}
那么如何正常关闭应用程序并说没有足够的内存呢?
答案 0 :(得分:1)
不传播异常需要做很多事情,标准通过指定std::terminate
来实现(如果异常会以其他方式逸出),则可以做到这一点。
没有程序其余部分的上下文,我们不知道这是其中之一,还是仅留下main
的异常。
对后者的修复可能看起来像
int main()
{
try
{
// whatever here
}
catch (std::exception & e)
{
std::cerr << e.what();
return EXIT_FAILURE;
}
}
答案 1 :(得分:0)
new
操作符会自己抛出bad_alloc
!因此,请使用try-catch
块:
pointer allocator<T>(size_type count) const
{
try
{
void* buffer = new (count * sizeof(T));
}
catch (bad_alloc& ba)
{
return nullptr; // or do whatever you have to do to recover
}
}
另请参见here。