当试图用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);
}
我不允许以任何方式修改接口(interface)方法。
据我了解,我需要为该方法填充内存并对其进行操作。但是,抛出异常将从该方法返回,而不是让我释放资源。我的代码是否正确,还是应该以其他方式解决?
最佳答案
std:runtime_error
需要一个std::string
,因此给它一个std::string
而不是char*
:
int status;
getFooStatus(&status);
if (!status) {
int infoLogLength;
getFooLogLength(&infoLogLength);
std::string log(infoLogLength, '\0');
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]);
}