C++ 覆盖删除运算符
我想重写类中的delete运算符。以下是我试图做的,但没有成功C++ 覆盖删除运算符,c++,oop,new-operator,C++,Oop,New Operator,我想重写类中的delete运算符。以下是我试图做的,但没有成功 class Complex{ void *operator new(size_t s); void operator delete(void *ptr); }; void Complex::operator delete(void *ptr){ delete ptr; } 我得到一个错误: 删除void*未定义 如错误消息所示,您不能删除avoid*。试试这个: // See
class Complex{
void *operator new(size_t s);
void operator delete(void *ptr);
};
void Complex::operator delete(void *ptr){
delete ptr;
}
我得到一个错误:
删除void*未定义
如错误消息所示,您不能
删除avoid*
。试试这个:
// See http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=40
#include <new> // for size_t
class Complex
{
public:
Complex() {}
~Complex() {}
static void* operator new (size_t size) {
return new char[size];
}
static void operator delete (void *p) {
return delete[] static_cast<char*>(p);
}
};
int main () {
Complex *p = new Complex;
delete p;
}
//请参见http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=40
#包括//用于尺寸\u t
阶级情结
{
公众:
复数(){}
~Complex(){}
静态void*运算符新(大小\u t大小){
返回新字符[大小];
}
静态void操作符删除(void*p){
返回delete[]static_cast(p);
}
};
int main(){
复合物*p=新复合物;
删除p;
}
通过delete进行删除是很奇怪的,但是删除一个void*
是很奇怪的
另外,size\u t
不是内置类型:它是在
中定义的
这很好:
#include <cstddef>
class Complex
{
void *operator new(size_t s);
void operator delete(void *ptr);
};
void* Complex::operator new(size_t s)
{ return new char[s]; } //allocate a buffer of s bytes
void Complex::operator delete(void *ptr)
{ delete[] static_cast<char*>(ptr); } //deallocate the buffer
#包括
阶级情结
{
void*新操作员(尺寸);
作废操作员删除(作废*ptr);
};
void*Complex::运算符新建(大小)
{返回新字符[s];}//分配一个s字节的缓冲区
void Complex::运算符删除(void*ptr)
{delete[]static_cast(ptr);}//释放缓冲区
实际上,我们在new/delete中一致地分配/释放适当大小的缓冲区
在new
中,我们要求系统为我们提供所需的字节。我使用了char[s]
,因为char
是内存的单位size\u t
measures:sizeof(char)==1
在delete
中,我们必须将ptr
标识的字节返回给系统。
由于我们将它们分配为char[]
,因此必须将它们作为char[]
删除,因此使用delete[]
和转换为char*
您的声明是正确的。问题在于实现操作员删除
的代码中:它使用关键字删除
,而不是调用全局操作员删除
。这样写:
void Complex::operator delete(void *ptr) {
::operator delete(ptr);
}
这是假设您的操作员新建
使用了您可能需要的全局操作员新建
::删除ptr代码>方法签名看起来是错误的,new
没有size\t
参数(只有new[]
有),但是delete
有一个size\t
参数。您不能覆盖delete
操作符;这是一个语言关键词。您所做的是覆盖运算符delete
,这是一个由delete
运算符调用的函数。这听起来像是文字游戏,但这是一个重要的区别。delete不应将size\u t作为参数。因为我想这样写:Complex c=new Complex();删除c<代码>操作员删除
必须撤消操作员新建所做的任何操作。你能给我们看一下新的操作符吗?那么,我可以知道这两行中发生了什么吗?在这里使用static\u cast
,而不是reinterpret\u cast
@emiliogaravglia:使用static\u cast
撤消隐式转换(char*
隐式转换为void*
),reinterpret\u cast
太强。您没有重新解释任何内容,只是正确地撤消了隐式强制转换@AntonioKumar-是的,可以编写静态成员函数来调用全局操作符new
,就像这样。当然,这就提出了一个问题,为什么它会存在,因为它只做编译器在没有它的情况下会做的事情。