正确重载new/delete new[]/delete[]

问题描述 投票:0回答:2

这是我之前问题的后续,

使用 malloc 初始化类

该问题的接受答案有效,并为我提供了 avr-gcc 上的 new/delete,这就是问题所在,但我的重载 new 删除对常规 gcc 造成了严重破坏,重载 new 删除的正确方法是什么?我所有的类都派生自一个共同的类基类,所以理想情况下我想为我的对象覆盖新的删除,这样它就不会与 stl stdlib 等混淆。

c++ memory-management
2个回答
8
投票

'new' 和 'delete' 可以在您的公共

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
课程(如您的问题和链接中所述)]


3
投票

在你自己的类中重载

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
运算符。

© www.soinside.com 2019 - 2024. All rights reserved.