這是一個跟進我剛纔的問題,正確重載新/刪除新的[] /刪除[]
Initializing a class using malloc
關於這一問題的作品接受的答案,並給了我新的/刪除的AVR- gcc,這裏是問題,但我的重載新的刪除包裹破壞常規gcc浩劫,什麼是重載刪除所有我的類從一個共同的基類派生的正確方法,所以理想情況下,我想重寫新的刪除我的對象,所以它不會弄亂stl stdlib等
這是一個跟進我剛纔的問題,正確重載新/刪除新的[] /刪除[]
Initializing a class using malloc
關於這一問題的作品接受的答案,並給了我新的/刪除的AVR- gcc,這裏是問題,但我的重載新的刪除包裹破壞常規gcc浩劫,什麼是重載刪除所有我的類從一個共同的基類派生的正確方法,所以理想情況下,我想重寫新的刪除我的對象,所以它不會弄亂stl stdlib等
'新'和'刪除'可以重載內普通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
類派生的(如你的問題和鏈接提到)
沒有常見的「對象」基類。你正在考慮Java/C#的土地。 :) – 2011-05-02 15:50:40
@ billy-oneal:準確地說,這就是他創造它的原因。他只是使用名稱「Object」來引用根類。 – 2011-05-02 15:51:53
@Billy,OP在他的問題中提到「我的所有類都來自一個共同的基類」,並且在他的鏈接問題中他將它命名爲「對象」。 – iammilind 2011-05-02 15:52:54
超載的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
派生的所有類將能夠使用這些超載new
和delete
運營商。
爲什麼不只是'拋出std :: bad_alloc;'?沒有理由爲此創建一個命名變量。 – 2011-05-02 15:54:24
@Billy ONeal:已更正。剛剛抓住我,而我正要編輯第一個版本:) – 2011-05-02 15:58:30
@Hamza Yerlikaya:由於您專門爲您自己的班級重載了它們,所以只會爲您班級的對象調用操作符。所有其他對象將使用全局新建和刪除。如果你不需要異常,你可能應該重載'nothrow'版本的新版本。 – 2011-05-02 16:06:12
另請參閱本FAQ條目:http://stackoverflow.com/questions/4421706/operator-overloading/4421791#4421791。 – sbi 2011-05-02 16:10:14
我很好奇 - 鏈接解決方案破壞了什麼破壞? – 2011-05-02 17:41:01