【发布时间】:2015-12-20 13:54:05
【问题描述】:
我正在编写一个代码,我需要在其中添加数据来创建std::string(这里的数据是指应用程序的日志)。但是字符串也有其大小的限制。我已经在try-catch 块中编写了代码,当append() 失败时,它会抛出异常。我需要在append() 之前检查是否附加新字符串会导致任何exception,因为一旦抛出异常,它会清除字符串中的数据。
我想检查附加新字符串是否会导致任何异常,如果是,则将数据写入文件并清除字符串以供下次输入。
因为它是一个应用程序日志,我不知道最终的大小是多少。所以我试图让代码更不容易受到上述问题的影响。
我检查了一个条件如下:
如果是“current_string_size + to_be_attached_string_size exceeds string.max_size()”,则将代码写入文件。
如果“不是”,则将 to_be_attached_string 附加到 current_string。
但它在某个地方失败了。
我需要检查什么条件?
【问题讨论】:
-
但它在某处失败了在什么意义上?你能提供一个最小的复制代码吗?
string::max_size()通常很大... -
我们在谈论
std::basic_string::max_size()和std::basic_string::append()吗?前者通常不需要担心,而后者从 C++11 开始就有强大的异常安全保证。 -
在写出日志之前尝试填满所有 RAM 不是一个好主意 - 您可能会面临操作系统内存不足的例程开始终止应用程序的风险,或者由于内存过度使用而导致崩溃,以及更多定期写入日志内容可能是检查程序是否仍然运行正常和/或帮助调试崩溃的有用方法。最多将大约 16kb 的内容缓冲到文件中,然后将
write缓冲到文件中 - 远远超过这不太可能显着提高性能。 -
@Walter:我写过类似的代码:string strData; void fun(input_string) { try { if ((strData.size() + input_string_size) >= strData.max_size()) { // 将 strData 写入文件并清除 strData 以供下次输入。返回; } strData.append(input_string); } 捕捉(异常 e){ 返回; } }
-
@SamL -
max_size()非常没用,因为它只是为您提供了理论大小的上限。分配更多将总是抛出异常。如果你的程序中有其他一些数据结构,通常你甚至无法接近这个值。
标签: c++ windows string exception append