四、異常監(jiān)測(cè)和異常處理
1.檢測(cè)異常
上面的例子還缺少必要的保護(hù)機(jī)制。比如,重載的delete運(yùn)算符函數(shù)并沒(méi)有檢查它的參數(shù),確認(rèn)其是否落在內(nèi)存池內(nèi)部。如果你絕對(duì)相信自己編的程序中不會(huì)傳遞錯(cuò)誤的指針值給delete運(yùn)算符,那么可以省掉合法性檢查以提高效率,特別是在優(yōu)先考慮效率的程序中。否則應(yīng)該使用預(yù)編譯的條件語(yǔ)句。在軟件的測(cè)試版本中加入這些檢測(cè),在正式的發(fā)行版本中去掉這些檢查。
2.重載new和delete中的異常處理
上面的兩個(gè)重載運(yùn)算符函數(shù)都是用了異常處理。異常處理是C++的新內(nèi)容之一,目前還沒(méi)有講到。在這里不必關(guān)心它是如何工作的。上面程序中,當(dāng)試圖分配超過(guò)內(nèi)存池容量的Names緩沖區(qū),重載的new運(yùn)算符函數(shù)就會(huì)拋出異常,終止程序。
五、重載new[]和delete[]
對(duì)于上面的程序,假如有下面的語(yǔ)句:
Names *nms=new Names[10]
...
delete [] nms;
那么,這些語(yǔ)句會(huì)調(diào)用全局new和delete運(yùn)算符,而不是重載過(guò)的new和delete。為了重載能為對(duì)象數(shù)組分配內(nèi)存的new和delete運(yùn)算符,必須像下面的程序一樣,對(duì)new[]和delete[]也進(jìn)行重載。
#include iostream.h
#include string.h
#include stddef.h
#include new.h
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< };
char Names::pool[maxnames * sizeof(Names)];
bool Names::inuse[maxnames];
void* Names::operator new[](size_t size) throw(bad_alloc)
{
int elements=size/sizeof(Names);
int p=-1;
int i=0;
while((i {
if(!inuse[i]) p=i;
++i;
}
// Not enough room.
if ((p==-1) || ((maxnames-p) for(int x=0; x return pool+p*sizeof(Names);
}
void Names::operator delete[](void* b) throw()
{
if(b!=0)
{
int p=((char*)b- pool)/sizeof(Names);
int elements=inuse[p];
for (int i=0; i }
}
int main()
{
Names* np = new Names[maxnames];
int i;
for(i=0; i {
cout< char name[25];
cin >> name;
*(np + i) = name;
}
for(i=0; idisplay();
delete [] np;
return 0;
}
重載new[]和delete[]要比重載new和delete考慮更多的問(wèn)題。這是因?yàn)閚ew[]運(yùn)算符時(shí)為數(shù)組分配內(nèi)存,所以它必須記住數(shù)組的大小,重載的delete[]運(yùn)算符才能正確地把緩沖區(qū)釋放回內(nèi)存池。上面的程序采用的方法比較簡(jiǎn)單,吧原來(lái)存放緩沖區(qū)使用標(biāo)志的布爾型數(shù)組換成一個(gè)整型數(shù)組,該數(shù)組的每個(gè)元素記錄new[]運(yùn)算符分配的緩沖區(qū)個(gè)數(shù),而不再是一個(gè)簡(jiǎn)單的true。當(dāng)delete[]運(yùn)算符函數(shù)需要把緩沖區(qū)釋放回內(nèi)存池時(shí),它就會(huì)用該數(shù)組來(lái)確認(rèn)釋放的緩沖區(qū)個(gè)數(shù)。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |