2010-11-16 67 views
1

任何人我关于构造压倒一切..重写操作

我在我的课有这个

void operator delete(void*) {} 

void operator delete(void* p, void*) {} 

..看起来像重载(相同的函数名和返回类型,但不同的参数列表),但其压倒一切..怎么了压倒一切的..

人的解释我这两条线的功能。

+0

你能否使用删除表达式调用第二次重载? – Chubsdad 2010-11-16 06:41:04

+0

其不超载..其超载..其实我并不了解这两个功能 – Model 2010-11-16 06:47:37

+0

有一个问题:为什么?详细说明;你想达到什么目的?如果你想在你的类被释放时想要特别的行为,那就写一个析构函数。 – Ashe 2010-11-16 07:10:30

回答

0

他们重载delete运算符,而第二个是使用“位置删除”。 Placement new/delete是一种黑客攻击,因此您可以让C++构造函数在您提供的内存之上初始化该类(而不是:: new),并可能使用其他参数(如您在此处看到的内容)。谷歌可以填补你的血淋淋的细节。

+0

不,我不明白.. – Model 2010-11-16 06:55:46

+1

这是C++的一个讨厌的角落。通常当你调用new和delete时,你将使用C++编译器的实现来实际分配和释放内存。 C++可以让你重写这个行为,并且你可以声明你自己的新版本和删除版本。如果你(或其他作者)这样做,你可以做各种疯狂的(有时是有用的)事情,并且你可以添加额外的参数给新的和删除的调用。这个话题比我现在可以深入一点,但Google对于“放置新的”和“放置删除”有更深的理解,并且您会发现很多信息。 – xscott 2010-11-16 07:02:39

+0

ahhan ok谢谢! – Model 2010-11-16 07:22:44

1
void operator delete(void*) {} 
void operator delete(void* p, void*) {} 

这些是自定义释放函数。通过delete表达式调用释放函数。例如。

YourClass* p = new YourClass(); // Allocates memory & calls constructor 
// ... whatever, then 
delete p;       // Calls destructor & deallocates memory 

对于你的类中的最后一行的delete表达上述将第一调用析构函数,然后将其称之为单void*参数释放函数,所述类定义中,第一的你的两个功能,如果该取消分配是可访问的。

但是,可能是因为使其无法访问,释放函数被声明为privateprotected。在第一种情况下,delete表达式在类自己的代码之外将不会编译(不可访问的释放函数)。如果是这样的话,那可能就是整个问题 - 或者,如果没有意义的话,不要感到惊讶。

顺便问一下,看看this tutorial。这显然是网络上对C++最不好的免费介绍。 Bruce Eckel的电子书"Thinking in C++"也是免费的,但它有一些错误和错误信息(它曾经是另一种方式,但在cplusplus.com的教程曾经非常糟糕,曾经)。

干杯&心连心,

+2

现在我觉得我应该买一本C++书..很快 – Model 2010-11-16 07:37:24

+1

+1在C++中思考是一本很好的书,对于那些首先了解编程的人来说。如果你知道书中的一些错误,我敢打赌,如果你为他指出这些错误,Eckel会很高兴。 – daramarak 2010-11-16 09:16:24

+0

@daramarak我提到过关于错误,因为好的布鲁斯并没有修正报告的错误,所以,多年来人们一次又一次地提出了相同的问题。干杯, – 2010-11-16 09:29:42

0

这些是运营商删除超载,当delete在对象上调用被调用。从3.7.3.2(取消分配函数):

每个释放函数应返回void,其第一个参数应为void *。解除分配功能 可以有多个参数。 如果一个类T具有名为operator 正好与一个参数删除一个成员释放函数,则该函数是通常的(非配置)释放函数。如果 类T不声明这样的操作者删除,但确实声明一个成员释放函数 名为operator正好用两个参数,一个具有输入第二个删除的std ::的size_t (18.1),则该函数是通常的解除分配功能。

,12。5免费存储:

当执行delete表达式,所选择的释放函数应具有的 存储的块的地址称为要回收作为第一个参数,并(如果两参数样式被使用)的大小为 该块作为其第二个参数

我不确定你的第二个函数是否可以被调用,因为它不是'通常的释放函数'。

+0

它可以手动调用,或者如果构造函数抛出,它可以通过调用相应位置new的'new'表达式来调用。这是自动调用展示位置删除的唯一情况。微软曾经打击过使用placement new来帮助调试的“聪明”想法,但却忘了定义相应的位置删除。结果是内存被泄漏,但只在调试版本中...... :-)这是最臭名昭着的MFC错误之一。干杯, – 2010-11-16 07:35:45

+0

@Alf我没有意识到这一点,谢谢:) – icecrime 2010-11-16 07:37:43