Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 覆盖删除运算符_C++_Oop_New Operator - Fatal编程技术网

C++ 覆盖删除运算符

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

我想重写类中的delete运算符。以下是我试图做的,但没有成功

class Complex{              
    void *operator new(size_t s);
    void operator delete(void *ptr);
};

void Complex::operator delete(void *ptr){
    delete ptr;
}
我得到一个错误:

删除void*未定义


如错误消息所示,您不能
删除
a
void*
。试试这个:

// 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
,就像这样。当然,这就提出了一个问题,为什么它会存在,因为它只做编译器在没有它的情况下会做的事情。