【发布时间】:2020-07-29 13:33:06
【问题描述】:
我无法捕捉到在插入地图时分配内存失败,这导致由于分段错误而导致崩溃。
struct Data
{
int64_t arr[100000000000000000]; // Large data to cause allocation failure
};
typedef unordered_map<int64_t, Data> UOM;
int main()
{
//void* p = malloc(sizeof(int64_t)*100000000000000000);
//void* p = new int64_t [100000000000000000];
//cout <<p <<endl;
UOM m;
try
{
m[1];
} catch(...)
{
}
}
如果我们使用 malloc 它将返回一个 NULL 而 new 抛出 std::bad_alloc 可以被捕获。但是,需要分配此内存的插入 map 会崩溃(出现分段错误)。
为什么会这样?按照标准应该是什么行为?
编辑:平台、编译器是:Redhat 6.10 上带有“-std=c++11”标志的旧编译器 g++ 4.7.1。是的,我们生活在石器时代!
【问题讨论】:
-
为什么会这样?
-
不能捕获内存分配错误。请注意,如果我们直接 new/malloc 可以捕获相同的分配失败。
-
我可以在我的机器上捕捉到
std::bad_alloc(正在抛出)。 -
我认为你只看到了一条日志消息,但异常被正确捕获
标签: c++ exception out-of-memory new-operator