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不同,那它是什么呢?
展开
 我来答
飘渺世间天
2007-04-02 · TA获得超过2650个赞
知道大有可为答主
回答量:843
采纳率:0%
帮助的人:1092万
展开全部
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++中动态内存的分配和释放都是由指针来完成。

这些都是很基础的问题,楼主该好好补补了......
百度网友ec167ac34
2007-04-02 · TA获得超过1788个赞
知道小有建树答主
回答量:1312
采纳率:0%
帮助的人:1151万
展开全部
void* names::operator new(size_t) throw(bad_alloc)
如果new分配不到内存,即分配内存失败则用throw(bad_alloc)抛出异常.
同理inuse[((char* )p-pool)/sizeof(names)]=false
也是一样的道理的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式