假設我有此示例代碼:返回由重載操作新不同的類指針在類
class A
{
public:
static void* operator new(size_t sz);
private:
int xA;
float yA;
};
class B : public A
{
private:
int xB;
float yB;
};
void* A::operator new(size_t sz)
{
void* ptr = (void*)new B();
return ptr;
}
int main()
{
B* b = (B*) new A();
// Use b ..
delete b;
return 0;
}
在這裏,構造將在該順序被調用(在VS2012測試):
- 一個構造
- 乙構造
- 一個構造
前兩個構造函數調用是因爲重載的operator new函數中的new B()
。 但是,然後A函數將被函數返回的指針再次調用,因爲重載的操作符new應該返回一個指向空閒內存的指針(不創建對象),所以再次調用構造函數。
如果我在本例中使用指針b
,這是未定義的行爲嗎?
你應該返回原始記憶。新操作符和新表達式(它也會調用ctor)之間有區別 – PlasmaHH
爲'A'重載'new'和'delete'操作符創建/銷燬'B'對象始終是可怕的周圍! –
這裏有些不對勁。發佈後,代碼具有無限遞歸。 'B'從'A'繼承'operator new',因此'A :: operator new'中的'new B()'表達式調用'A :: operator new'。 –