转到清理

在以前是 C 的 C++代码库中,可以找到模式 goto cleanup。由于 goto 命令使函数的工作流程更难理解,因此通常可以避免这种情况。通常,它可以由 return 语句,循环,函数替换。虽然,随着 goto cleanup,人们需要摆脱清理逻辑。

short calculate(VectorStr **data) {
    short result = FALSE;
    VectorStr *vec = NULL;
    if (!data)
       goto cleanup;  //< Could become return false

    // ... Calculation which 'new's VectorStr

    result = TRUE;
cleanup:
    delete [] vec;
    return result;
}

在 C++中,可以使用 RAII 来解决此问题:

struct VectorRAII final {
    VectorStr *data{nullptr};
    VectorRAII() = default;
    ~VectorRAII() {
        delete [] data;
    }
    VectorRAII(const VectorRAII &) = delete;
};

short calculate(VectorStr **data) {
    VectorRAII vec{};
    if (!data)
       return FALSE;  //< Could become return false

    // ... Calculation which 'new's VectorStr and stores it in vec.data

    return TRUE;
}

从这一点开始,可以继续重构实际代码。例如,通过 std::unique_ptrstd::vector 替换 VectorRAII