new和delete的三种形式详解
⼀、new操作符、delete操作符
class String
{
public:
String(const char *str="")
{
if(str== NULL)
{
data=new char[1];
data='\0';
}
else
{
data=new char[strlen(strlen(str)+1];
strcpy(data,str);
}
~String()
{
delete[] data;
data=NULL;
}
private:
char *data;
};
在上⾯的String类中,当你去定义⼀个String对象时,⽤new去创建对象时,⽤delete去析构该对象时,此时new 和delete有两个操作,分别是当⽤new创建对象时,第⼀步是先去开辟内存空间,第⼆步则是使⽤构造函数去构造对象。同样当⽤delete去析构对象时也同样有两个操作,第⼀步是去调⽤析构函数去析构对象,第⼆步则是释放其内存空间。在使⽤new创建对象时和⽤delete析构对象时,它们的顺序是相反的。
⼆、操作符new、操作符delete
void* operator new(size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete(void *p)
{
free(p);
}
void* operator new[](size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete[](void *p)
{
free(p);
}
当你去创建⼀个对象时,new操作符则会包含两步操作,第⼀步先去调⽤上⾯的重载操作符new的函数,先去开辟内存空间,第⼆步去调⽤类的构造函数去构造对象。当去析构⼀个对象时,delete操作符也同样包含两步操作,第⼀步先去调⽤类的析构函数去析构对象,第⼆步调⽤上⾯的重载操作符delete的函数,将内存空间释放。同样的,这是⽤new创建单个对象的函数,当你需要动态开辟数组空间时,下⾯两个函数则是开辟数组空间的函数和释放数组内存空间的函数。需要特别注意的是,void* operator new(size_t sz);函数的参数类型必须是size_t类型即⽆符号整
数类型,且函数的返回值必须是void*类型,否则编译不通过,下⾯的开辟数组空间的函数也是⼀样的。
三、定位new
void* operator new(size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete(void *p)
{
free(p);
}
void* operator new[](size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete[](void *p)
{
free(p);
}
class String
{
public:
String(const char *str="")
{
if(str== NULL)
{
data=new char[1];
data='\0';
}
else
{
data=new char[strlen(strlen(str)+1];
strcpy(data,str);
}
~String()
{
delete[] data;
data=NULL;
}
private:
char *data;
};
void* operator new(size_t sz,int *d,int pos)
{
return &d[pos];
}
int main()
{
String *ps= (String*)operator new(sizeof(String));
new(ps)String("Hello");
truncate delete区别ps->~String();
operator delete(ps);
//new(p)类型(初始值)
int ar[10];
new(ar,3)int(10);
new(ar,5)int(99);
new(ar,9)int(9);
return0;
}
定位new即运算符new进⾏重载,在重载的函数中需要去使⽤⼀个额外的指针去指向所开辟的数组空间,pos即数组中的下标位置,即将所需要的数据插⼊到指定的pos位置,这就是定位new。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。