2011-05-02 52 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