Правильная перегрузка нового / удаление нового [] / удаление [] - PullRequest
5 голосов
/ 02 мая 2011

Это продолжение моего предыдущего вопроса,

Инициализация класса с помощью malloc

Принятый ответ на вопрос работает и дает мне новый / удалить наavr-gcc, вот проблема, но мой перегруженный новый delete нарушает работу обычного gcc, как правильно перегрузить новый delete, все мои классы являются производными от общего базового класса, так что в идеале я хотел бы просто переопределить новое удаление для моего объектачтобы он не связывался с stl stdlib и т. д.

Ответы [ 2 ]

8 голосов
/ 02 мая 2011

'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 (как указано в вашем вопросе и ссылке)]

2 голосов
/ 02 мая 2011

Перегрузите 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...