这是一个跟进我刚才的问题,正确重载新/删除新的[] /删除[]
Initializing a class using malloc
关于这一问题的作品接受的答案,并给了我新的/删除的AVR- gcc,这里是问题,但我的重载新的删除包裹破坏常规gcc浩劫,什么是重载删除所有我的类从一个共同的基类派生的正确方法,所以理想情况下,我想重写新的删除我的对象,所以它不会弄乱stl stdlib等
这是一个跟进我刚才的问题,正确重载新/删除新的[] /删除[]
Initializing a class using malloc
关于这一问题的作品接受的答案,并给了我新的/删除的AVR- gcc,这里是问题,但我的重载新的删除包裹破坏常规gcc浩劫,什么是重载删除所有我的类从一个共同的基类派生的正确方法,所以理想情况下,我想重写新的删除我的对象,所以它不会弄乱stl stdlib等
'新'和'删除'可以重载内普通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
类派生的(如你的问题和链接提到)
没有常见的“对象”基类。你正在考虑Java/C#的土地。 :) – 2011-05-02 15:50:40
@ billy-oneal:准确地说,这就是他创造它的原因。他只是使用名称“Object”来引用根类。 – 2011-05-02 15:51:53
@Billy,OP在他的问题中提到“我的所有类都来自一个共同的基类”,并且在他的链接问题中他将它命名为“对象”。 – iammilind 2011-05-02 15:52:54
超载的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
运营商。
为什么不只是'抛出std :: bad_alloc;'?没有理由为此创建一个命名变量。 – 2011-05-02 15:54:24
@Billy ONeal:已更正。刚刚抓住我,而我正要编辑第一个版本:) – 2011-05-02 15:58:30
@Hamza Yerlikaya:由于您专门为您自己的班级重载了它们,所以只会为您班级的对象调用操作符。所有其他对象将使用全局新建和删除。如果你不需要异常,你可能应该重载'nothrow'版本的新版本。 – 2011-05-02 16:06:12
另请参阅本FAQ条目:http://stackoverflow.com/questions/4421706/operator-overloading/4421791#4421791。 – sbi 2011-05-02 16:10:14
我很好奇 - 链接解决方案破坏了什么破坏? – 2011-05-02 17:41:01