// 结点类
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时出现的问题。
事实上就是一个深拷贝与浅拷贝的问题,这个错误有时不太容易被发现。