為什麼透過基底指標刪除派生物件陣列可能是未定義的
在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中文網其他相關文章!