轉到清理

在以前是 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