簡體   English   中英

為什么通過分配指針來串聯兩個鏈表是錯誤的?

[英]Why is concatenating two linked lists by assigning pointers wrong?

因此,我們的講師只是向我們展示了如何連接兩個鏈表,然后繼續向我們展示了示例,如果實施該示例,那將是錯誤的。我似乎不太了解為什么它不能很好地工作,因為它不是如果我以這種方式連接兩個鏈表會出現什么問題:

template <typename T>
void LList<T>::concat(LList<T> const & list) {
    end->next = list.start;
    end = list.end;
}

問題中使用的方法是錯誤的,因為它錯誤地共享了所轉移節點的所有權

list擁有其節點。 它維護並最終釋放它們。 通過將指向list所擁有的節點的指針提供給接收鏈表,您現在將擁有兩個鏈表,它們引用並試圖擁有同一組節點。 如果您以后修改list ,則將修改接收者,並可能使其處於不一致狀態(例如, end可能不再正確)。 如果稍后銷毀list ,則在list銷毀其節點后,接收方將指向無效的內存。 同樣,通過修改或銷毀接收器, list處於不穩定狀態。

這在某種程度上與“三規則”有關,這是三規則所需的副本構造函數,我將利用它來擺脫這種混亂局面。 我將按值而不是作為參考傳遞list ,以便正確地復制它,然后將其節點列表(源列表所擁有的節點的副本)移動到接收鏈接列表中。 然后,您可以清理list以便安全銷毀該list ,並使其在超出范圍時死亡。 這種方法可能會有點慢,但是幾乎是萬無一失的。 有關應用於賦值運算符的幾乎相同的技巧,請參見復制和交換慣用語

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM