2015-05-21 37 views
-3
class String 
{ 
private: 
    char *s; 
    int size; 
public: 
   String(const char *str = NULL); // constructor 
    ~String() { delete [] s;  }// destructor 
    //String(const String&); // copy constructor --> i get double free error while running without this 
    void print() { cout << s << endl; } // Function to print string 
    void change(const char *);  // Function to change 
}; 

String::String(const char *str) 
{ 
    size = strlen(str); 
    s = new char[size+1]; 
    strcpy(s, str); 
} 

void String::change(const char *str) 
{ 
    delete [] s; 
    size = strlen(str); 
    s = new char[size+1]; 
    strcpy(s, str); 
} 

/*String::String(const String& old_str) 
{ 
    size = old_str.size; 
    s = new char[size+1]; 
    strcpy(s, old_str.s); 
}*/ 

int main() 
{ 
    String str1("Hello"); 
    String str2 = str1; 

    str1.print(); // printed 
    str2.print(); 

    str2.change("Helloworld"); 

    str1.print(); // not printed 
    str2.print();// printed 

    return 0; 
} 

http://ideone.com/xJtoTf獲得雙重釋放錯誤時不使用拷貝構造函數

我得到一個雙錯誤並沒有被打印的str1打印第二次(見上面的代碼中的註釋)...

是因爲當我在這裏不使用複製構造函數時,而是使用被調用的默認拷貝構造函數,並且str2str1都指向相同的位置?

+2

http://en.cppreference.com/w/cpp/language/rule_of_three –

+0

@HansPassant謝謝.. – 0xdeadbeef

回答

3

String str2 = str1;調用複製構造函數,而不是賦值運算符。

由於您沒有提供複製構造函數,編譯器會自動提供一個。所有將要做的就是複製成員數據。

因此str2str1將共享相同的字符緩衝區。繁榮!

+0

謝謝..我剛剛讀了三條規則......現在有道理..我是每當一個複製構造函數被認爲是一個深層複製時,就會發生。 – 0xdeadbeef