如何在引发异常时安全地处理数组指针
How to safely deal with an array pointer when throwing an exception
当尝试C++方法封装C API时,我发现抛出异常时出现问题:
int status;
char* log = nullptr;
int infoLogLength;
getFooStatus(&status);
getFooLogLength(&infoLogLength);
if (!status) {
log = new char[infoLogLength];
getFooLog(infoLogLength, log);
throw std::runtime_error(log);
}
我不允许以任何方式修改接口方法。
据我了解,我需要为要填充的方法保留内存,并对其进行操作。但是,抛出异常将从该方法返回,不允许我释放资源。我的代码是否正确,还是我应该以其他方式解决此问题?
>std:runtime_error
期望一个std::string
,所以给它一个std::string
而不是一个char*
:
int status;
getFooStatus(&status);
if (!status) {
int infoLogLength;
getFooLogLength(&infoLogLength);
std::string log(infoLogLength, ' ');
getFooLog(infoLogLength, &log[0]);
throw std::runtime_error(log);
}
或者,您可以传递一个 char*
,只需以促进自动释放的方式分配它,例如:
int status;
getFooStatus(&status);
if (!status) {
int infoLogLength;
getFooLogLength(&infoLogLength);
std::vector<char> log(infoLogLength);
getFooLog(infoLogLength, &log[0]);
throw std::runtime_error(&log[0]);
}
据
我所知,runtime_error有两个重载,一个带有常量*字符,另一个是常量字符串&。
我相信构造一个 std::string 作为局部变量并将其传递给runtime_error应该会导致它被正确清理。
有一种简单的方法可以处理异常,而无需重构代码,以便数组由其析构函数清理的对象管理。即:
char* log = nullptr;
try {
int status;
int infoLogLength;
getFooStatus(&status);
getFooLogLength(&infoLogLength);
if (!status) {
log = new char[infoLogLength];
getFooLog(infoLogLength, log);
throw std::runtime_error(log);
}
} catch (...) { // special C++ syntax: "catch any exception"
delete [] log;
throw; // special C++ syntax: "re-throw" current exception
}
如果你只有一catch (...)
,看起来很像C++支持finally
。catch (...)
和 finally
功能之间的区别在于catch (...)
不会无条件执行:它仅在没有更具体的catch
时才执行。因此,如果要在同一try
块中添加其他 catch 子句,它们都必须重复delete [] log
清理操作。
这可以通过使用嵌套来缓解:
try { // real exception-handling try
try { // try for unwind protection only
...
} catch (...) {
// clean-up statements
throw;
}
} catch (actual_error &err) {
...
} catch (another_exc_type &exc) {
...
}
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 窗口上信号处理程序的异步安全写入函数
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 从函数安全返回和处理动态分配的内存,C++ 11
- 我可以使用模板作为多态处理数组的安全解决方案
- 以更健壮和类型安全的方式处理ASCII命令
- 使TSYNEDIT线线程安全用于背景处理
- 在 CLI 中转换日期时间time_t错误处理C++是否安全
- 内联 asm 分配给"FS:0":处理程序未注册为安全处理程序
- C++ 密码处理安全实践
- 如果我对async_read进行两次调用,那么只有在处理完第一次调用之后,才会处理第二次调用,这是否安全
- 这是实现错误处理的安全方法吗
- 从其处理程序或处理程序 dtor 销毁 boost::asio 计时器是否安全?
- 在单元安全代码中处理文本零
- X 的错误处理程序抛出异常是否安全?
- 提升线程 - 安全/有保证的处理线程中断的方式
- 信号处理程序异步安全函数
- 在处理大文件 (> 2GB) 时,将pos_type分配给uint64_t是否安全?
- SIGRTMIN和SIGRTMAX在信号处理程序中使用安全吗?