问题标签 [exception-safety]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - C++ unordered_map 异常安全
我在 C++ 规范 (cplusplus.com) 中徘徊,发现没有任何关于 std::unordered_map 异常安全的信息
所以基本上如果我写
并且因为我的内存不足或 bad_alloc 而引发异常,我可以假设我的地图是什么?
- 它处于有效状态吗?(基本保证)
- 它保持不变?(强力保证)
- 它处于无效状态?(不保证)
go - 调用 log.Fatalln 时是否调用了延迟函数?
如果template.ParseGlob("")
返回错误,是否db.Close()
仍然被调用?
c# - 以异常安全和内存友好的方式创建 XML 文件?
我想为我当前的项目编写一个带有 XML 输出的 Logger/Bug-Tracker。如果它应该是重复的,我很抱歉,但这些建议没有用,我也没有找到一个好的谷歌解决方案。
1:我的第一个问题是关于异常安全的。
如果我使用 XmlDocument,则日志将存储在内存中,直到我调用保存。这意味着如果发生异常,我可能会失去一切。
如果我使用 XmlWriter 它不会存储在内存中(afaik),但我必须关闭编写器和所有元素/节点,这些元素/节点也可能在出现异常的情况下缺失。我可以关闭并重新打开编写器(使用文档末尾的指针)吗?
创建异常安全的 XML 的最佳解决方案是什么?(我只需要提示)
2:我的第二个问题是关于内存使用的。
因为它是一个跟踪工具,所以输出可能非常巨大。因此我不能使用 XmlDocument。在我看来,XmlWriter 将是最好的解决方案。我说得对吗?
3:我最后一个[小]问题是关于时间消耗的。
使用 XML 文件进行跟踪是好主意还是坏主意?它会减慢我的程序多少?
我希望你能帮助我。
编辑:我为什么要使用 XML ? 稍后,我的应用程序将在“未知”环境中运行,因此我可以通过 Internet 将日志发送到服务器,并且我必须验证文件 (XMLSchema)。完成此操作后,我想将其转换为可读性更好(格式更佳)的 HTML 文件。
正如你所看到的,这是一个比 XML 更好的可视化(这仍然需要一些微调,但它的功能)
编辑 2:当前状态 我已经进行了一些内存使用测量。记录器(目前基于 XmlDocument :( )对于 5.000.000 个条目需要 ~600mb。不是最好的结果,但也不是最差的。
最好的问候亚历克斯
c++ - 异常安全 C++ 共享指针
我尝试在 C++ 中实现 JSON 框架,并希望利用多态概念。我有一个类JSONNode
,它是一种存储其他 JSONNode 对象本身的容器,依此类推。我正在使用指针和动态分配来做到这一点。为了异常安全,我不想使用new/delete
但使用 boost 共享指针。将元素(进一步的 json 对象)添加到 json 对象的基本场景如下所示:
为了更容易使用,我宁愿不显式分配element
并将共享指针的创建放入类方法中Add
:
但这仍然是异常安全的吗?我猜不是因为共享指针的创建不是通过 JSONNode* 的分配立即完成的。你怎么看?还是有其他更常见的方法来实现这一点?
c++ - 异常安全和 make_unique
只是为了澄清一下,make_unique
当您在一个表达式中有多个分配时,使用只增加异常安全性,而不仅仅是一个,对吗?例如
是完全异常安全的(就分配和东西而言),而
是不正确的?
c++ - Should I write the end of the file in the destructor?
I have some code which looks a bit like this:
The close function writes some xml close tags so the file can be parsed properly. The constructor writes the header of the xml file. One could consider xmlWriter.close();
clean-up code. It is common advice for C++ to put clean-up code into destructors. This way you can never forget to clean-up properly. However, in our case the clean-up code could throw. (Imagine that file
could have exceptions enabled, writes to a file can fail.) Therefore, if the close()
function is called in the destructor, then it should be wrapped in a try-catch block which eats all exceptions thrown:
However, in this case the caller will not be notified about any errors. The function writeToStream()
could fail to write the closing xml tags to the file without the caller knowing about it. What is best practice in this situation?
c++ - 使用析构函数处理失败与 catch (...) { fix(); 扔; }
假设我正在做一些需要在抛出异常时进行清理的事情。
例如,假设我正在创建一个动态数组,并且我需要构造对象,但它们的构造函数可能会抛出异常:
我可以通过以下方式修复它catch (...) { ...; throw; }
:
或通过作用域析构函数:
我应该在什么时候使用哪种技术,为什么?
(注意:这个例子只是为了展示两种技术之间的区别。我知道它不是完美的代码,所以请不要专注于这个特定的例子。这只是为了说明。)
c++ - 异常安全:
我想请教一些关于异常安全的建议。特别是我一直在参考你(真的)写异常安全代码吗?. 如果我有一个指向类型对象的指针容器Node
,并且我要使用新的对象集合清除并重新初始化该对象容器_nodes
,那么这段代码是否是异常安全的?
我也一直在阅读 RAII,但我不知道这在我需要多态性的情况下如何工作(http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping)。
c++ - 有没有办法不杀死抛出 std::bad_alloc 的 Qt 应用程序?
异常安全在现代 C++ 中非常重要。
这里已经有一个关于异常安全的大问题。所以我不是在谈论一般的异常安全。我真的在谈论 C++ 中 Qt 的异常安全性。Stack Overflow 上还有一个关于Qt 异常安全的问题,我们有 Qt文档。
在阅读了我能找到的关于 Qt 异常安全的所有内容之后,我真的觉得用 Qt 实现异常安全非常困难。因此,我自己不会抛出任何异常。
真正的问题在于 std::bad_alloc:
- Qt 文档指出,从 Qt 的信号槽连接机制调用的槽中抛出异常被认为是未定义的行为,除非它是在槽中处理的。
- 据我所知,Qt 中的任何插槽都可能抛出 std::bad_alloc。
在我看来,唯一合理的选择是在抛出 std::bad_alloc之前退出应用程序(我真的不想进入未定义的行为领域)。
实现此目的的一种方法是重载 operator new 并且:
- 如果在 GUI 线程中发生分配失败:退出(杀死)应用程序。
- 如果在另一个线程中发生分配失败,只需抛出一个 std::bad_alloc。
在写那个 operator new 之前,我真的很感激一些反馈。
- 这是个好主意吗 ?
- 这样我的代码会异常安全吗?
- 甚至可以用 Qt 编写异常安全代码吗?
arrays - 用 make_shared 初始化 std::array
背景
我正在为网络协议编写驱动程序并有一个函数write(std::shared_ptr<package> package)
,其中package
是std::array<buffer_ptr,2>
(0=>header,1=>body)。为方便起见,我想编写一个函数write(buffer_ptr body)
,该函数会自动生成标题并调用write
. 为此,我想要我们std::make_shared
,但是我在std::array
从make_shared
通话中初始化时遇到了问题。
代码
我尝试了什么???
(这些导致编译器错误)
问题:
有没有解决方案来完成这项工作,还是我必须写一些类似的东西:
package_ptr package=new package{header, body}; 写(包);
1.b)我是否会因为不得不求助而失去效率
package_ptr(new package)
?(我记得在一个块中为指针和实例共享分配内存,以节省内存请求)在Cppreference上读取:
此外,如果 g 抛出异常, f(shared_ptr(new int(42)), g()) 可能会导致内存泄漏。如果使用 make_shared 则不存在此问题。
为什么内存会泄漏(可以在被调用之前
int(42)
构造,在g
被g
调用之前shared_ptr
被调用)?1. 中的替代代码是否会遭受这种潜在的泄漏?