2013-08-27 31 views
5
struct A final 
{ 
    int a; 

    void* operator new(size_t size) 
    { 
     // 
     // Is size always equal to sizeof(A) here? 
     // 
     return ::operator new(size); 
    } 

    void operator delete(void* ptr) 
    { 
     ::operator delete(ptr); 
    } 
}; 

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
    } 
} 

我的問題也嵌入在代碼中。傳入A :: operator new()的尺寸是否總是等於sizeof(A)?

C++標準是否保證傳入A :: operator new()的大小總是相同的?

更新: 在這裏,只考慮A是最終的類。

回答

4

報價,第5.3.4節點10:

一個新的表達通過的空間要求的 分配函數作爲第一個參數的量類型std :: size_t。參數應該不小於正在創建的對象的大小; 它可能大於正在創建的對象的大小,僅當對象是數組時 。

所以,是的,它保證與對象的大小相同。但請注意,不同的編譯器或不同的編譯器選項可能會在編譯時改變特定對象的實際大小。

4

嘗試:

struct B: public A 
{ 
    double a; 
} 

現在,當您創建A B

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
     delete new B; 
    } 
} 

PS新的運營商將獲得不同的尺寸增加打印看看吧:

void* operator new(size_t size) 
{ 
    std::cout << "S(" << size << ")\n"; 
    // 
    // Is size always equal to sizeof(A) here? 
    // 
    return ::operator new(size); 
} 

O安輸出:從C++ 11標準

> ./a.out 
S(4) 
S(12) 
S(4) 
S(12) 
S(4) 
+0

如果A是最後一堂課,怎麼樣? – xmllmx

+1

@xmllmx:C++中沒有這樣的東西 –

+0

請查看帖子。我修改了它。我使結構A最終。 – xmllmx

相關問題