2011-05-02 49 views
3

這是一個跟進我剛纔的問題,正確重載新/刪除新的[] /刪除[]

Initializing a class using malloc

關於這一問題的作品

接受的答案,並給了我新的/刪除的AVR- gcc,這裏是問題,但我的重載新的刪除包裹破壞常規gcc浩劫,什麼是重載刪除所有我的類從一個共同的基類派生的正確方法,所以理想情況下,我想重寫新的刪除我的對象,所以它不會弄亂stl stdlib等

+1

另請參閱本FAQ條目:http://stackoverflow.com/questions/4421706/operator-overloading/4421791#4421791。 – sbi 2011-05-02 16:10:14

+0

我很好奇 - 鏈接解決方案破壞了什麼破壞? – 2011-05-02 17:41:01

回答

6

'新'和'刪除'可以重載內普通Object基地類。所以,這隻適用於該層次結構。

class Object { 
public: 
    void* operator new (size_t size); 
    void operator delete (void *p); 
}; 

class Derived : public Object { 
// uses the above versions of new/delete 
}; 

[注:這是一個額外的好處給你所有的類都可以從一個共同的Object類派生的(如你的問題和鏈接提到)

+0

沒有常見的「對象」基類。你正在考慮Java/C#的土地。 :) – 2011-05-02 15:50:40

+3

@ billy-oneal:準確地說,這就是他創造它的原因。他只是使用名稱「Object」來引用根類。 – 2011-05-02 15:51:53

+0

@Billy,OP在他的問題中提到「我的所有類都來自一個共同的基類」,並且在他的鏈接問題中他將它命名爲「對象」。 – iammilind 2011-05-02 15:52:54

2

超載的new & delete裏面你自己的班級&不全球。
對於例如:如果你的普通類的名字是YourClass,可以按如下方式重載它們:

void *YourClass::operator new(size_t size) 
{ 
    void *p; 
    cout << "In overloaded new."; 
    p = malloc(size); 
    if(!p) 
    { 
     throw std::bad_alloc; //Throw directly than with named temp variable 
    } 
    return p; 
} 

void YourClass::operator delete(void *p) 
{ 
    cout << "In overloaded delete.\n"; 
    free(p); 
} 

void *YourClass::operator new[](size_t size) 
{ 
    void *p; 
    cout << "Using overload new[].\n"; 
    p = malloc(size); 
    if(!p) 
    { 
     throw std::bad_alloc; 
    } 
    return p; 
} 

void YourClass::operator delete[](void *p) 
{ 
    cout << "Free array using overloaded delete[]\n"; 
    free(p); 
} 

YourClass派生的所有類將能夠使用這些超載newdelete運營商。

+0

爲什麼不只是'拋出std :: bad_alloc;'?沒有理由爲此創建一個命名變量。 – 2011-05-02 15:54:24

+0

@Billy ONeal:已更正。剛剛抓住我,而我正要編輯第一個版本:) – 2011-05-02 15:58:30

+0

@Hamza Yerlikaya:由於您專門爲您自己的班級重載了它們,所以只會爲您班級的對象調用操作符。所有其他對象將使用全局新建和刪除。如果你不需要異常,你可能應該重載'nothrow'版本的新版本。 – 2011-05-02 16:06:12