这是对我上一个问题的跟进,
Initializing a class using malloc
关于这个问题的接受的答案是有效的,并且给了我关于avr-gcc的新/删除,这里是问题,但是我的重载新删除对常规gcc造成严重破坏,重载新删除所有我的类派生的正确方法是什么一个共同的基类,所以理想情况下我想覆盖我的对象的新删除,所以它不会混乱stl stdlib等。
答案 0 :(得分: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
课程(如您的问题和链接中所述)]
答案 1 :(得分: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
派生的所有类都可以使用这些重载的new
和delete
运算符。