#include <cstdlib>
struct B {
virtual void f();
void mutate();
virtual ~B();
};
struct D1 : B { void f(); };
struct D2 : B { void f(); };
void B::mutate() {
new (this) D2; // reuses storage — ends the lifetime of *this
f(); // undefined behavior - WHY????
... = this; // OK, this points to valid memory
}
我需要解釋爲什麼f()
invokation有UB? new (this) D2;
重用存儲,但它也調用D2
的構造函數,並自啓動新對象的生命週期。 f()
等於this -> f()
。 這就是我們只需撥打D2
的成員函數f()
。誰知道它爲什麼是UB?重用新對象的存儲開始生命週期嗎?
Placement-new應該在大多數派生類中使用,並將它們替換爲相同類型的對象。這是您擁有UB的另一個原因,因爲您不僅要替換基類子對象,而且要用不同類型的對象替換它。 – 0x499602D2 2014-09-04 04:51:04
@ 0x499602D2標準的18.6.1.3定義了這樣的位置的行爲 - 新的,但沒有說任何關於假設在大多數派生類中使用**以及創建相同類型的對象** – 2014-09-04 04:55:06
3.8「如果在一個對象的生命週期已經結束,一個新的對象被創建在原始對象所佔據的存儲位置,[...]原始對象的名稱將自動引用新對象[...]用於在以下情況下操作新對象:原始對象是類型T的派生對象(1.8),新對象是類型T的派生對象(即,它們不是基類子對象)。 – 0x499602D2 2014-09-04 04:58:02