首頁  >  文章  >  後端開發  >  為什麼在 C 中透過基底指標刪除派生物件陣列是未定義行為?

為什麼在 C 中透過基底指標刪除派生物件陣列是未定義行為?

Patricia Arquette
Patricia Arquette原創
2024-10-30 07:31:27700瀏覽

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

為什麼透過基底指標刪除派生物件陣列可能是未定義的

在C 中,刪除陣列的行為是未定義的,如果物件的動態類型與其靜態型別不同。 C 03 標準(5.3.5 [expr.delete] p3) 對此進行了概述:「在第二種選擇(刪除數組)中,如果要刪除的物件的動態類型與其靜態類型不同,則行為未定義. "

為了說明這一點,請考慮以下程式碼片段:

<code class="cpp">struct B { virtual ~B() {} };
struct D : B {};

B* p = new D[20];
delete[] p; // undefined behavior</code>

雖然使用基底指標刪除派生物件陣列似乎很直觀,但標準將其指定為未定義行為。這是因為基底指標 p 指向數組中第一個元素的基子對象,而不是第一個元素本身。

實作陣列的多態刪除需要檢索元素類型,執行動態轉換,然後執行簡單的刪除[]。然而,即使不利用多態性,這也會產生不必要的開銷。

因此,為了避免未定義的行為和不必要的開銷,重要的是要記住數組不能表現出多態性。相反,如果需要多態行為,可以單獨實現。

總結:

  • 陣列不支援多態行為,以避免懲罰合法使用。
  • 如果需要的話可以單獨實現數組的多態刪除。

以上是為什麼在 C 中透過基底指標刪除派生物件陣列是未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn