因此...已經提供了使用std::string
的解決方案,但讓我給出另一種解決方案,保持您的成員變量不變。
問題是這樣的。假設你有這樣的代碼的地方:
Player p1("Bob"); // Okay
Player p2("Annie"); // Okay
p2 = p1; // Oops! (1)
Player p3(p1); // Oops! (2)
在(1),該方法Player& Player::operator=(const Player&)
被調用。既然你沒有提供,編譯器會爲你生成一個。當它這樣做時,它只是假定它可以複製所有成員變量。在這種情況下,它複製了Player::name
和Player::length
。所以,我們有p1.name == p2.name
。現在調用p2
的析構函數時,將刪除p2.name
指向的已分配內存。然後當調用p1
的析構函數時,相同的內存將被刪除(因爲p1.name == p2.name
)!這是違法的。
要解決這個問題,你可以自己寫一個賦值操作符。 (2),發生同樣的問題。您沒有複製構造函數,因此編譯器會爲您生成一個。它也會假設它可以複製所有的成員變量,所以當析構函數被調用時,它們會嘗試再次刪除相同的內存。爲了解決這個問題,也寫了拷貝構造函數:
Player::Player(const Player& other)
{
if (this == &other) return;
length = other.length;
name = new char[length + 1];
for (unsigned int i = 0; i < length; ++i) name[i] = other.name[i];
}
在這一天結束時,你應該使用雖然一個std::string
。
該類是否遵循[Rule of Three](http://stackoverflow.com/questions/4172722)?如果沒有,那麼你很可能會刪除兩次相同的緩衝區。使用'的std :: string'正確地管理動態內存給你,除非你特別想練習指針雜耍技能。 –
你怎麼知道它是引起問題這個特殊的代碼? – Jon
相關:[五規則(http://stackoverflow.com/questions/4782757/rule-of-three-becomes-rule-of-five-with-c11) – Deduplicator