相关疑难解决方法(0)

抛出新的std :: exception vs throw std :: exception

看着一些代码,我偶然发现:

throw /*-->*/new std::exception ("//...
Run Code Online (Sandbox Code Playgroud)

我一直认为你不需要/你不应该new在这里使用.
什么是正确的方法,都可以,如果有的话有什么区别吗?

BTW从我所看到的同时"使用PowerShell提升库"的"grepping"永远不会使用throw new.

PS我也发现了一些使用的CLI代码throw gcnew.这可以吗?

c++ exception

105
推荐指数
4
解决办法
5万
查看次数

C++中异常对象的范围

C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?

c++ scope exception-handling

39
推荐指数
2
解决办法
8340
查看次数

Hinnant的堆栈分配器和异常

我想将Hinnant的堆栈分配器(文档,实现)与STL容器结合使用,但我想修改它,以便永远不会发生动态内存分配.

要实现这一点,必须要做的一件事是,如果堆栈提供的缓冲区中没有空间,则替换allocate/deallocate方法中的new/delete调用.

但是我应该如何处理异常呢?STL容器可能会抛出异常,例如

的std ::矢量::在

"该函数自动检查n是否在向量中的有效元素范围内,如果不是[...]则抛出out_of_range异常"

http://www.cplusplus.com/reference/vector/vector/at/

我无法找到动态或静态内存中存储异常的明确答案.只有这些行给出提示:

从[except.throw] /15.1/4开始:

除非在3.7.4.1中指出,否则异常对象的内存以未指定的方式分配.

最后的参考文献[basic.stc.dynamic.allocation]/4表示:

[注意:特别是,不会调用全局分配函数来为异常对象(15.1)分配存储空间. - 结束说明]

/sf/answers/1908193171/

这到底是什么意思?是否为静态内存中的异常保留了内存?或者是否仍然以"未指定的方式"发生任何分配,这意味着将动态存储异常?引用的描述为解释带来了很大的空间......

所以我的基本问题是:如果禁止动态内存使用,使用STL容器+ Hinnant的堆栈分配器是否安全?或者这不起作用,我要么必须使用-fno-exceptions通过abort()调用替换异常或实现我自己的STL容器的替换,不抛出异常......?

提前致谢!

启发

c++ heap stack allocation exception

5
推荐指数
1
解决办法
222
查看次数

编译器如何根据 exception_ptr 管理异常存储

当抛出 C++ 异常并发生堆栈展开时,需要有一些存储区域让异常对象保持活动状态,直到执行后离开最外层 catch 块的范围。

但是这个存储空间究竟在哪里呢?在stackoverflow上寻找答案,我发现:https : //stackoverflow.com/a/27259902/2923952

这个答案引用了标准,说:

异常对象的内存以未指定的方式分配,除非在 3.7.4.1 中注明。

... [注意:特别是,不会调用全局分配函数来为 [...] 异常对象 (15.1) 分配存储空间。— 尾注]

那讲得通。您不希望编译器生成对幕后mallocnew幕后的调用,因为您可能正在编写具有特定Allocator要求的代码。

由于活动异常的数量受硬编码堆栈深度的限制,因此似乎没有任何需要为异常动态分配空间。编译器可能只有一些堆栈空间或每个线程的静态存储来放置活动异常。

但现在我们有std::exception_ptr. 这基本上是一个活动异常对象的 shared_ptr,只要该异常对象的任何实例std::exception_ptr仍然存在,该异常对象就会保持活动状态。

但由此推论,我们现在可以无限期地延长任何活动异常的生命周期。所以基本上我可以有一个std::vector<std::exception_ptr>, 然后在一个循环中我可以不断抛出异常并将每个指向当前异常的指针存储在我的向量中。所以我可以通过这种方式动态生成数百万个活动异常。

std::vector<std::exception_ptr> active_exceptions;
for (;;)
{
   try { throw int{}; }
   catch (...) { active_exceptions.push_back(std::current_exception()); }
}
Run Code Online (Sandbox Code Playgroud)

这将迫使编译器以某种方式动态添加更多存储以保持这些异常活动。那么它是如何做到这一点的呢?它是否会在静态存储用完后重新使用malloc/ new

c++

5
推荐指数
1
解决办法
72
查看次数

标签 统计

c++ ×4

exception ×2

allocation ×1

exception-handling ×1

heap ×1

scope ×1

stack ×1