перегрузка delete [] оператор, позволяющий сжимать массивы типов с деструктором

0

Мы пытаемся перегрузить оператор delete [], чтобы достичь сокращаемости, ориентированного на массивы объектов.

Он отлично работает с типами данных без конкретного деструктора.

Когда тип данных имеет указанный деструктор, новому оператору [] нужны дополнительные байты.

Не могли бы вы помочь нам ответить на эти вопросы?

  1. Почему новый оператор [] требует дополнительных байтов для типов данных с конкретным деструктором?
  2. Всегда ли новый оператор [] запрашивает эти байты или зависит от библиотеки?
  3. Можно ли узнать, имеет ли тип данных конкретный деструктор с выражением if?

Код должен вызывать необработанное исключение, когда он пытается сжать массив 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;
}

Ответ ответил на вопрос:

overload delete [] с конкретными аргументами

  • 2
    Я думаю, что любое дополнительное пространство, необходимое новым операторам, определяется реализацией, и полагаться на это - плохая идея. Почему вы используете оператор вместо {} для вашего оператора if? Это не обычная практика.
  • 0
    "оператор вместо {} для вашего оператора if" я вас не понимаю :(
Показать ещё 18 комментариев
Теги:
operator-overloading
realloc
delete-operator

1 ответ

0
Лучший ответ

Это может ответить на вопросы 1 и 2

Когда оператор new используется для создания нового массива, файл cookie обычно сохраняется для запоминания выделенной длины (количества элементов массива), чтобы он мог быть освобожден правильно.

В частности:

No cookie is required if the array element 'type T' has a trivial destructor.

Это значит:

  • Поскольку структура A имеет тривиальный деструктор, для нее не требуется cookie.
  • Поскольку структура B имеет конкретный деструктор, для нее требуется куки размером с sizeof(size_t) байт, который хранится посредине слева от массива.

Ссылка: Itanium C++ ABI

Ещё вопросы

Сообщество Overcoder
Наверх
Меню