Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果map.insert失败,如何在不使用bad_alloc的情况下检查其失败_C++ - Fatal编程技术网

C++ 如果map.insert失败,如何在不使用bad_alloc的情况下检查其失败

C++ 如果map.insert失败,如何在不使用bad_alloc的情况下检查其失败,c++,C++,如果在我的代码中,我有一个 class A; A ob; pair<map<int,A>::iterator,bool> ret; ret=map.insert(pair<int,A>(1,ob)); A类; 产科医生; 配对ret; ret=映射插入(对(1,ob)); 如果map由于内存不足而无法插入ob,它将抛出bad_alloc 但有没有其他方法来检查insert是否失败,因为我有一个不使用名称空间和异常处理的限制。 我们不能使用某种空指针比较语句

如果在我的代码中,我有一个

class A;
A ob;
pair<map<int,A>::iterator,bool> ret;
ret=map.insert(pair<int,A>(1,ob));
A类;
产科医生;
配对ret;
ret=映射插入(对(1,ob));
如果map由于内存不足而无法插入ob,它将抛出bad_alloc 但有没有其他方法来检查insert是否失败,因为我有一个不使用名称空间和异常处理的限制。
我们不能使用某种空指针比较语句吗?

标准库通过抛出
std::bad_alloc
报告分配内存失败。虽然您可以使用
new(nothrow)
来解决这个问题,但您不能使用标准库类来解决这个问题

异常处理是C++的一部分;它不是C++的可选部分。异常是处理错误条件的标准C++方式。我知道你在一个不允许你捕获异常的环境中工作,但是你必须接受你工作在一个不允许你使用所有C++的环境中。所以你的能力会受到限制

应该注意的是,除非您使用的是自定义分配器,否则从“无法分配”错误中恢复不太可能是容易实现的。无法分配内存只会因为应用程序内存不足而发生。在这种情况下,就让异常被抛出;由于不使用异常,它将转义
main
,并导致程序崩溃。这正是你想要发生的


如果您确实有办法在耗尽可分配地址空间的情况下生存下来,那么如果您无法捕获异常,您将无能为力。C++标准库类是设计用来与C++一起工作的,这意味着所有的库类。包括异常。

不允许使用异常处理?重新考虑这一点。C++标准库的一些部分在内部使用异常,这意味着不能使用编译器开关关闭异常。如果启用了异常,您也可以使用它们,或者当然可以实现自己的无异常标准库。

为什么要捕获此错误?当程序内存不足时,你会做什么?我必须把我要插入的内存中的对象进行处理。然后我会清除地图本身。你不能真正退出标准C++中的异常处理。当然,您在使用
std::map
时已经违反了“无命名空间”部分。但这两条“规则”最好被违反。好吧……但在我的情况下,我不能让程序终止,所以我想我必须用其他方式。@gold:如果我们知道你有这样的限制,我们可以给出更好的答案。但是你的个人资料显示你是一名学生;您正在使用哪种安全关键设备?这是唯一一种不应该终止的程序。即使对于装配线,内存不足时最好的操作方法是完全关闭。@gold:好的,您的程序无法分配内存。你打算如何从中恢复过来?即使您得到一个空指针或任何您想要的东西,您实际会做什么来恢复?现在,由于系统内存不足,几乎所有新的内存分配都会失败。当程序内存不足时,您打算如何继续执行程序?此代码是服务器的一部分,因此我们不能让它终止..我只需要检查此条件,以便解除分配之前分配的对象,并安全地从函数返回..我可以使用,但它将在项目和其他方面包含更多风险它将抛出名称空间中的错误分配,我也不想包含该名称空间,因为它未在整个项目中使用,并可能导致其他复杂性。@gold:您不想“包含该名称空间”吗?您已经在使用
std::map
。“包含名称空间”船已经启航。您已经在使用名称空间。事实上,您使用的名称空间与
std::bad_alloc
所属的名称空间相同。对于C++是如何工作的,你似乎有一种强烈的恐惧和缺乏理解力。名称空间并不可怕;你担心什么“并发症”?如果你编程不好(不使用RAII和其他优秀的C++习语),那么异常就应该被担心。