Мы пытаемся перегрузить оператор delete [], чтобы достичь сокращаемости, ориентированного на массивы объектов.
Он отлично работает с типами данных без конкретного деструктора.
Когда тип данных имеет указанный деструктор, новому оператору [] нужны дополнительные байты.
Не могли бы вы помочь нам ответить на эти вопросы?
Код должен вызывать необработанное исключение, когда он пытается сжать массив 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;
}
Ответ ответил на вопрос:
Это может ответить на вопросы 1 и 2
Когда оператор
new
используется для создания нового массива, файл cookie обычно сохраняется для запоминания выделенной длины (количества элементов массива), чтобы он мог быть освобожден правильно.В частности:
No cookie is required if the array element 'type T' has a trivial destructor.
Это значит:
sizeof(size_t)
байт, который хранится посредине слева от массива.Ссылка: Itanium C++ ABI