我正在编写一个简单的程序来理解new和delete运算符重载。 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;
}
答案 0 :(得分:3)
当您编写类似new loc
的表达式时,编译器具有静态类型信息,可以让它知道loc
对象的大小。因此,它可以生成将sizeof loc
传递到loc::operator new
的代码。在创建数组时,编译器可以类似地确定通过将数组大小乘以sizeof loc
来保存数组中所有对象所需的空间,然后还提供一些额外的空间量(在实现中确定 - 它将在内部用于存储有关数组中元素数量的信息。
希望这有帮助!