c++new和delete运算符重载遇到问题求助!
#include<iostream>#include<cstring>#include<cstddef>#include<new>usingnamespacestd;co...
#include<iostream>
#include<cstring>
#include<cstddef>
#include<new>
using namespace std;
const int maxnames=5;
class names
{
char name[25];
static char names::pool[];
static bool names::inuse[maxnames];
public:
names(char* s)
{strncpy(name,s,sizeof(name));}
void* operator new(size_t) throw(bad_alloc);
void operator delete(void*) throw();
void display()const
{cout<<name<<endl;}
};
//简单的内存池处理确定数量的names
char names::pool[maxnames*sizeof(names)];
bool names::inuse[maxnames];
void* names::operator new(size_t) throw(bad_alloc)
{
for(int p=0;p<maxnames;p++)
{
if(!inuse[p])
{
inuse[p]=true;
return pool+p*sizeof(names);
}
}
throw bad_alloc();
}
void names::operator delete(void* p) throw()
{
if(p!=0)
inuse[((char* )p-pool)/sizeof(names)]=false;
}
int main()
{
names* nm[maxnames];
int i;
for(i=0;i<maxnames;i++)
{
cout<<endl<<"enter name #"
<<i+1<<":";
char name[25];
cin>>name;
nm[i]=new names(name);
}
for(int i=0;i<maxnames;i++)
{
nm[i]->display();
delete nm[i];
}
system("pause");
return 0;
}
以上是源程序,有些地方不明白,请高手指点.
void* names::operator new(size_t) throw(bad_alloc)看不懂这个函数声明
throw bad_alloc();这个是干吗的呀?
重载delete运算符更看不懂了
void names::operator delete(void* p) throw()这个函数声明也不懂
{
if(p!=0)
inuse[((char* )p-pool)/sizeof(names)]=false;
}
尤其是这行代码 inuse[((char* )p-pool)/sizeof(names)]=false不知道是干吗的
请哪位高手帮我分析分析,不胜感激!
void* names::operator new(size_t) throw(bad_alloc)
size_t是什么啊?为什么拿它做为形参?
void names::operator delete(void* p) throw()
这里的p显然和new运算符重载函数里的p不同,那它是什么呢? 展开
#include<cstring>
#include<cstddef>
#include<new>
using namespace std;
const int maxnames=5;
class names
{
char name[25];
static char names::pool[];
static bool names::inuse[maxnames];
public:
names(char* s)
{strncpy(name,s,sizeof(name));}
void* operator new(size_t) throw(bad_alloc);
void operator delete(void*) throw();
void display()const
{cout<<name<<endl;}
};
//简单的内存池处理确定数量的names
char names::pool[maxnames*sizeof(names)];
bool names::inuse[maxnames];
void* names::operator new(size_t) throw(bad_alloc)
{
for(int p=0;p<maxnames;p++)
{
if(!inuse[p])
{
inuse[p]=true;
return pool+p*sizeof(names);
}
}
throw bad_alloc();
}
void names::operator delete(void* p) throw()
{
if(p!=0)
inuse[((char* )p-pool)/sizeof(names)]=false;
}
int main()
{
names* nm[maxnames];
int i;
for(i=0;i<maxnames;i++)
{
cout<<endl<<"enter name #"
<<i+1<<":";
char name[25];
cin>>name;
nm[i]=new names(name);
}
for(int i=0;i<maxnames;i++)
{
nm[i]->display();
delete nm[i];
}
system("pause");
return 0;
}
以上是源程序,有些地方不明白,请高手指点.
void* names::operator new(size_t) throw(bad_alloc)看不懂这个函数声明
throw bad_alloc();这个是干吗的呀?
重载delete运算符更看不懂了
void names::operator delete(void* p) throw()这个函数声明也不懂
{
if(p!=0)
inuse[((char* )p-pool)/sizeof(names)]=false;
}
尤其是这行代码 inuse[((char* )p-pool)/sizeof(names)]=false不知道是干吗的
请哪位高手帮我分析分析,不胜感激!
void* names::operator new(size_t) throw(bad_alloc)
size_t是什么啊?为什么拿它做为形参?
void names::operator delete(void* p) throw()
这里的p显然和new运算符重载函数里的p不同,那它是什么呢? 展开
展开全部
void* names::operator new(size_t) throw(bad_alloc);
这是个 Exception specification,在函数参数列表后加上throw,throw括号内加上要抛出的异常的类型,这里的这个函数的意思就是它承诺只抛出std::bad_alloc这种异常,如果throw的括号内容为空,则该函数承诺不抛出任何异常。如果函数抛出了它所指定的能抛出的异常之外的类型,则std::unexpected就被调用,unexpected调用std::terminate(),terminate()调用C的abort()函数结束程序,如:
void f1()throw(toobig, toosmall, divzero)
{
......
throw other("This is the penalty!")
}
void f2()throw()
{
throw; // 同上
}
inuse[((char* )p-pool)/sizeof(names)]=false
这句的作用是把其先前标识的可用内存单元重新标识为可用,因为被你分配到的正内存池处于你的使用之中,其他程序无法使用它们,delete的作用是在你不再使用它们之后将其释放,这句和
if(!inuse[p])
{
inuse[p]=true;
return pool+p*sizeof(names);
}
对应。
size_t 是cstddef中unsigned int 的typedef,把它def出来是为了标识经常使用的非负数类型。
释放内存有delete 3这样的句式吗?无论是在C还是在C++中动态内存的分配和释放都是由指针来完成。
这些都是很基础的问题,楼主该好好补补了......
这是个 Exception specification,在函数参数列表后加上throw,throw括号内加上要抛出的异常的类型,这里的这个函数的意思就是它承诺只抛出std::bad_alloc这种异常,如果throw的括号内容为空,则该函数承诺不抛出任何异常。如果函数抛出了它所指定的能抛出的异常之外的类型,则std::unexpected就被调用,unexpected调用std::terminate(),terminate()调用C的abort()函数结束程序,如:
void f1()throw(toobig, toosmall, divzero)
{
......
throw other("This is the penalty!")
}
void f2()throw()
{
throw; // 同上
}
inuse[((char* )p-pool)/sizeof(names)]=false
这句的作用是把其先前标识的可用内存单元重新标识为可用,因为被你分配到的正内存池处于你的使用之中,其他程序无法使用它们,delete的作用是在你不再使用它们之后将其释放,这句和
if(!inuse[p])
{
inuse[p]=true;
return pool+p*sizeof(names);
}
对应。
size_t 是cstddef中unsigned int 的typedef,把它def出来是为了标识经常使用的非负数类型。
释放内存有delete 3这样的句式吗?无论是在C还是在C++中动态内存的分配和释放都是由指针来完成。
这些都是很基础的问题,楼主该好好补补了......
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询