overload delete []运算符允许带有析构函数的可缩小类型数组

时间:2014-10-16 00:27:28

标签: c++ operator-overloading realloc delete-operator

我们正在尝试重载 delete [] 运算符以实现shrinkable oriented to objects arrays

对于没有特定析构函数的数据类型,它可以正常工作。

当数据类型具有指定的析构函数时, new [] 运算符需要额外的字节。

您能否帮助我们回答这些问题?

  1. 为什么 new [] 运算符需要额外的字节用于具有特定析构函数的数据类型?
  2. 总是 new [] 运算符请求这些字节还是依赖于库?
  3. 是否可以知道数据类型是否具有带 if语句的特定析构函数?
  4. 代码在尝试缩小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[] operator with specific arguments

1 个答案:

答案 0 :(得分:0)

这可以回答点 1 2

  

当使用operator new创建新数组时,通常会使用cookie   存储以记住分配的长度(数组元素的数量)所以   它可以正确解除分配。

     

具体做法是:

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

这意味着:

  • 因为结构A有一个简单的析构函数,所以它不需要 cookie中。
  • 因为struct B有一个特定的析构函数,所以它需要一个sizeof(size_t)字节的cookie,它存储在数组的左边。

参考:Itanium C++ ABI