程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 小心指針被delete兩次

小心指針被delete兩次

編輯:C++入門知識

C++類中,有時候使用到傳值調用(對象實體做參數),遇到這種情況,可要小心了!特別是當你所傳值的對象生命周期較長,而非臨時對象(生命周期段)的時候。來看看下面的情況:

#include <iostream> using namespace std;   class Text { private:     char * str;   public:     Text(){str = new char[20];::memset(str,0,20);}     void SetText(char * str)     {         strcpy(this->str,str);     }     char * GetText() const{return str;}     ~Text()     {         cout << "~Text Destruction" << endl;         delete [] str;         cout << "~Text Over" << endl;     } };   void Print(Text str) {     cout << str.GetText() << endl; }   int main() {     Text t;     t.SetText("abc");     Print(t);     return 1; }

上面執行的結果程序崩潰了。原因:

Print(Text str)在對str進行復制構造的時候,沒有進行深度拷貝;當 Print退出的時候,因為是臨時對象(函數初始時構造),對str進行析構,此時還沒有任何破綻;但回到main,繼而退出main 的時候,又對t進行析構,但此時t內的str中的內容已經被銷毀。由於對一內存空間實施了兩次銷毀,於是出現內存出錯。

解決方法:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved