新建和删除运算符重载

new and delete operator overloading

本文关键字:重载 运算符 删除 新建      更新时间:2023-10-16

我正在编写一个简单的程序来理解新的和删除运算符重载。如何将size参数传递到new运算符中?

作为参考,这是我的代码:

#include<iostream>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
class loc{
    private:
        int longitude,latitude;
    public:
        loc(){
            longitude = latitude = 0;
        }
        loc(int lg,int lt){
            longitude -= lg;
            latitude -= lt;
        }
        void show(){
            cout << "longitude" << endl;
            cout << "latitude" << endl;
        }
        void* operator new(size_t size);
        void operator delete(void* p);
        void* operator new[](size_t size);
        void operator delete[](void* p);
};
void* loc :: operator new(size_t size){
    void* p;
    cout << "In overloaded new" << endl;
    p = malloc(size);
    cout << "size :" << size << endl;
    if(!p){
        bad_alloc ba;
        throw ba;
    }
    return p;
}
void loc :: operator delete(void* p){
    cout << "In delete operator" << endl;   
    free(p);
}
void* loc :: operator new[](size_t size){
    void* p;
    cout << "In overloaded new[]" << endl;
    p = malloc(size);
    cout << "size :" << size << endl;
    if(!p){
        bad_alloc ba;
        throw ba;
    }
    return p;
}
void loc :: operator delete[](void* p){
    cout << "In delete operator - array" << endl;   
    free(p);
}
int main(){
    loc *p1,*p2;
    int i;
    cout << "sizeof(loc)" << sizeof(loc) << endl;
    try{
        p1 = new loc(10,20);
    }
    catch (bad_alloc ba){
        cout << "Allocation error for p1" << endl;
        return 1;
    }
    try{
        p2 = new loc[10];
    }
    catch(bad_alloc ba){
        cout << "Allocation error for p2" << endl;
        return 1;
    }
    p1->show();
    for(i = 0;i < 10;i++){
        p2[i].show();
    }
    delete p1;
    delete[] p2;
    return 0;
}

当你编写一个像 new loc 这样的表达式时,编译器具有静态类型信息,可以让它知道loc对象有多大。因此,它可以生成将sizeof loc传递到loc::operator new的代码。 创建数组时,编译器可以类似地确定容纳数组中所有对象所需的空间量,方法是将数组大小乘以 sizeof loc ,然后还提供一些额外的空间量(以实现定义的方式确定),它将在内部用于存储有关数组中元素数的信息。

希望这有帮助!