转到清理
在以前是 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_ptr
或 std::vector
替换 VectorRAII
。