1.复制构造函数没有用引用而是值或指针
class A 
{
public:
A(const A a) { ... }  //因为每次传入一个对象时,会调用这个对象的拷贝构造函数,造成无限循环
  A(const A *a) { ... } //同上
  A(const A &a) { ... }
  ~A() { if(p!=NULL) { delete p; p=NULL; } } 
A* p;
};

2.析构函数无线循环
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};
不是构造的时候,是析构的时候,当析构的时候,p=this,delete p,即delete this,会再次调用析构函数,这是个无限递归调用