哪位牛人帮小弟我看看这个,小弟我都快被气疯了,是一个关于错误处理的有关问题,多谢啊 .

哪位牛人帮我看看这个,我都快被气疯了,是一个关于异常处理的问题,谢谢啊.... 在线等....
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
using std::cerr;
template<class T> class CUD{ //用于异常处理的类
private:
T data;
char* inf;
public:
CUD(T xdata,char* xinf){
data=xdata;
inf=new char[300];
strcpy(inf,xinf);
};
~CUD(){
delete []inf;// 这句语句就是出问题的地方!没有它程序运行无误。可是我不能没有它,没它我可就收不回内存了
};
T GetData();
char* GetInf();
};
template<class T> T CUD<T>::GetData(){
return data;
}
template<class T> char* CUD<T>::GetInf(){
return inf;
}

template <class T> class CStack;
template<class T>class CStackNode{
private:
T data;
CStackNode* link;
public:
CStackNode(T xdata=0, CStackNode<T>* xlink=NULL):data(xdata),link(xlink){};
~CStackNode(){};
friend class CStack<T>;
};
template<class T> class CStack{
private:
CStackNode<T>* top;
public:
CStack():top(NULL){};
~CStack(){};
void Push(T);
T Pop();
T GetTop() const;
void MakeEmpty();
void Display(char*);
};
template <class T>void CStack<T>::Push (T xdata){
top=new CStackNode<T>(xdata,top);
}
template <class T> T CStack<T>::Pop (){
if(top==NULL) throw CUD<T>('a',"检测到堆栈已经空了,刚才的POP操作被安全撤消。");
T temp1=top->data ;
CStackNode<T>* temp2=top;
top=top->link ;
delete temp2;
return temp1;
}
template <class T> T CStack<T>::GetTop()const{
return top->data ;
}
template <class T> void CStack<T>::MakeEmpty(){
CStackNode<T>* temp;
while(top!=NULL){
temp=top;
top=top->link ;
delete temp;
}
}
template <class T> void CStack<T>::Display(char* p){
cout<<p<<endl;
CStackNode<T>* temp=top;
while(temp!=NULL){
cout<<temp->data<<" ";
temp=temp->link;
}
cout<<endl;
}

void main(){
CStack<char> B;
int i=10;
int c=65;

cout<<"-------------------------------" //界面
<<endl
<<">>>本程序演示堆栈(采用模板机制实现)的数据存储实现。"
<<endl
<<"-------------------------------"
<<endl<<endl<<endl;

while(i--)B.Push ((char)c++);
try{
B.Display("第一次全装入后,按从栈顶至栈底的顺序排列,栈内的数据为:");
B.Pop();
B.Display ("进行一次Pop操作,栈内的数据为:");
B.Push ('J');
B.Display ("进行一次Push操作,把J元素压回堆栈,栈内的数据为:");
B.MakeEmpty ();
B.Display ("进行MakeEmpty操作,栈内的数据为:");
B.Pop ();
B.Display ("进行一次空POP情况后,栈内的数据为:");
}
catch(CUD<char>& Temp){
cerr<<Temp.GetInf ()<<endl;
}// 程序运行到这里时开始调用析构函数,结果出现了fatal error..晕 ...
B.Push ('N');
B.Display ("进行一次PUSH操作(N),栈内的数据为:");

cout<<endl
<<"----------------------------------------" //界面
<<endl
<<">>>程序设计无误,通过测试。等待确认退出。"
<<endl
<<"----------------------------------------"
<<endl;
}

------解决方案--------------------
怎么不写拷贝构造函数?

------解决方案--------------------
lz看看《c++ primer》异常部分吧
虽然是引用,也要写拷贝构造函数
不然要发生两次析构delete出错
------解决方案--------------------
我在VC6上试了一下,只要把CUD类的析构函数申明为virtual就可以正确有运行结束了...
C/C++ code

    virtual ~CUD()
    { 
        delete []inf;// 这句语句就是出问题的地方!没有它程序运行无误。可是我不能没有它,没它我可就收不回内存了 
        inf = NULL;
    };