浅拷贝会造成指针悬挂的问题。
举个例子:两个对象是s1和s2的指针_str都指向new开辟的同一块空间,如下图,主程序结束时,对象逐个撤销,先撤销对象s2,会调用析构函数释放动态分配的内存;再撤销对象s1时,s1._str所指向的内存空间已经是无法访问了,而s2._str原先指向的那块内存却无法释放,出现了所谓的指针悬挂! 两个对象企图释放同一块内存,从而导致一块内存被释放两次这也是不行的,运行会出错。
1 #include <iostream> 2 using namespace std; 3 4 class String 5 { 6 public: 7 String(char *str) 8 :_str(new char [strlen(str )+1]) 9 { 10 strcpy(_str, str); 11 } 12 String(const String & s) 13 { 14 _str = s._str; 15 } 16 String& operator=(const String & s ) 17 { 18 if (this !=&s) 19 { 20 _str = s._str; 21 } 22 return *this ; 23 } 24 ~String() 25 { 26 delete[] _str; 27 } 28 private: 29 char* _str; 30 }; 31 32 void Test() 33 { 34 String s1("Lynn" ); 35 String s2=s1; 36 } 37 int main() 38 { 39 Test(); 40 system("pause" ); 41 return 0; 42 }