【发布时间】:2011-12-06 03:36:05
【问题描述】:
更新:为 str1 的新数据分配内存。仍然记忆错误。
我正在尝试为我创建的字符串类重写 += 方法。
Class mystring{
public:
friend void operator+=(mystring& str1, const mystring& str2){
mystring temp;
delete[] temp.data;
temp.length = str1.length + str2.length;
temp.data = new char[temp.length + 1];
strcpy(temp.data, str1.data);
strcat(temp.data, str2.data);
delete[] str1.data;
str1.length = temp.length;
strcpy(str1.data, temp.data);
}
private:
char *data;
int length;
}
然后在主类中:
mystring str1("hi");
mystring str2("matt");
str1 += str2;
cout << str1 << endl;
这个函数正常工作,但是当我运行 valgrind 时出现内存错误。我无法弄清楚为什么会这样。如果有人可以给我任何很棒的提示。
谢谢
【问题讨论】:
-
你为什么要重新发明轮子?
-
请将相关错误显示在 valgrind 以及您的构造函数代码中。
-
请注意,您应该定义一个交换方法。您可能应该有一个特殊的 mystring 构造函数,因此您不必先删除 temp.data 。你应该使用 memcpy,因为你知道长度:strcpy 和 cat 是浪费的。在将 temp 设为新字符串后使用 swap 方法,您只需交换(*this,temp)。 Swap 只会交换指针和长度。
-
另一条评论,如果你想要更好的附加性能,你可能想要使用旧的 realloc() 而不是 new 和 delete。通常分配器可以在块的末尾找到新的内存,这意味着它不需要将旧数据移动到新位置:它只是扩展分配块。
标签: c++ memory operator-overloading valgrind