轉到清理
在以前是 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
。