关于c ++:正确重载new / delete new [] / delete []

Properly Overloading new/delete new[]/delete[]

这是我上一个问题的跟进,

使用malloc初始化类

问题的已接受答案有效,并在avr-gcc上给了我new / delete,这是问题所在,但是我的重载new delete wrack破坏了常规gcc,重载new delete的正确方法是什么? 类,所以理想情况下,我只想为我的对象覆盖new delete,这样它就不会与stl stdlib等混淆。


'new'和'delete'可以在常见的Object基类中重载。 因此,这将仅适用于该层次结构。

1
2
3
4
5
6
7
8
9
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类(如您的问题和链接所述)


在您自己的类中而不是全局地重载newdelete
例如:如果您的公共类的名称是YourClass,则可以按以下方式重载它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.
"
;
    free(p);
}

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

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

YourClass派生的所有类都将能够使用这些重载的newdelete运算符。