当试图用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]);
}

08-27 02:08