我们正在尝试重载 delete [] 运算符以实现shrinkable oriented to objects arrays。
对于没有特定析构函数的数据类型,它可以正常工作。
当数据类型具有指定的析构函数时, new [] 运算符需要额外的字节。
您能否帮助我们回答这些问题?
代码在尝试缩小B的数组时应该抛出一个未处理的异常。
#include<cstdlib>
#include<iostream>
using namespace std;
void*operator new[](size_t s){
cout<<"Block size: "<<s<<endl;
return malloc(s);
}
void operator delete[](void*p){
free(p);
}
void operator delete[](void*p,size_t s){
//Is it possible to know if the data type has a specific destructor?
bool destructor=0;
if(destructor){
p=(char*)p-8,s+=8;
}
cout<<"New block size: "<<s<<endl;
if(realloc(p,s)!=p)throw 0;
}
struct A{
char a;
A():a(0){}
~A()=default;
};
struct B{
char b;
B():b(0){}
~B(){}
};
int main(){
unsigned S=10,s=4;
cout<<"Creating "<<S<<" A's"<<endl;
A*a=new A[S];
cout<<"Creating "<<S<<" B's"<<endl;
B*b=new B[S];
cout<<"Shrinking A to "<<s<<" elements"<<endl;
operator delete[](a,sizeof(A)*s);
cout<<"Shrinking B to "<<s<<" elements"<<endl;
operator delete[](b,sizeof(B)*s);
cout<<"Deleting A and B"<<endl;
delete[]b,delete[]a;
return 0;
}
相关回答问题:
答案 0 :(得分:0)
这可以回答点 1 和 2
当使用operator
new
创建新数组时,通常会使用cookie 存储以记住分配的长度(数组元素的数量)所以 它可以正确解除分配。具体做法是:
No cookie is required if the array element `type T` has a trivial destructor.
这意味着:
sizeof(size_t)
字节的cookie,它存储在数组的左边。