这是我之前问题的后续,
该问题的接受答案有效,并为我提供了 avr-gcc 上的 new/delete,这就是问题所在,但我的重载 new 删除对常规 gcc 造成了严重破坏,重载 new 删除的正确方法是什么?我所有的类都派生自一个共同的类基类,所以理想情况下我想为我的对象覆盖新的删除,这样它就不会与 stl stdlib 等混淆。
'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
课程(如您的问题和链接中所述)]
在你自己的类中重载
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
运算符。