这是对我之前问题的跟进,使用malloc初始化类。该问题上的被接受的答案在avr-gcc上起作用并给了我new/delete,但我的重载new delete在常规gcc上出现了问题,那么正确的重载new delete的方法是什么呢?所有我的类都派生自一个公共基类,因此理想情况下,我只想为我的对象覆盖new delete,以便它不会干扰stl stdlib等。
Object
'基类内部可以重载'new'和'delete'。因此,这仅适用于该层次结构。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
运算符。
throw std::bad_alloc;
?没有必要为此创建一个命名变量。 - Billy ONealnothrow
版本的new。 - Alok Save