// 結點類
class Node {
public:
Node() {
}
Node(int key, std::string data) : key(key), data(data) {
}
bool operator<(const Node &other) {
if (key < other.key) {
return true;
} else {
return false;
}
}
Node& operator=(const Node &other) {
if (this != &other) {
key = other.key;
data = other.data;
}
return *this;
}
friend std::ostream& operator<<(std::ostream &out, const Node ¬e) {
out << "\'" << note.key << "," << note.data << "\'";
return out;
}
int key;
std::string data;
};
// 給此結點的數組動態分配內存
void reallocate() {
int newCapacity = capacity * 2;
T *tempData = new T[newCapacity];
// memcpy(tempData, data, capacity * sizeof(T)); // [[[[1]]]]
for (int i = 0; i < capacity; ++i) {tempData[i] = data[i];}// [[[[2]]]]
delete[] data;
data = tempData;
size = capacity;
capacity = newCapacity;
}
Node中的std::string中的字符串是用char*來存儲的。如果使用[[[[1]]]]處的memcpy,由于memcpy只是淺拷貝,簡單的把Node中的std::string的char*的首地址給拷貝過來,而其中真正的字符串內容并沒有復制過來,所以在delete[] data后,源Node中的std::string被釋放,所以其中的字符串也被刪除掉了。而在新的tempData->data->std::string.char*所指向的內容已經是無效的了,所以就出問題了。而使用[[[[2]]]]處的for循環來一個一個的復制對象,因為std::string的運算符=被重載過了,而會把其中的字符串內容也同時復制,所以就不會出現使用memcpy時出現的問題。
事實上就是一個深拷貝與淺拷貝的問題,這個錯誤有時不太容易被發現。