(清晰度更新)
已经在这个问题上苦苦挣扎了一段时间,希望对此有所了解。我为创建的类重载了addition
和assignment
运算符。 assignment
运算符似乎返回正常,但是接下来的行退出并显示此错误:
检测到堆损坏:在正常块(#160)之后的0x012CA7D0处。显像管 检测到堆结束后应用程序已写入内存 缓冲。
我对这两个运算符的代码如下:
HSString& HSString::operator =(const HSString& argStr) {
if (this != &argStr) {
delete[] str;
end = argStr.end;
cap = argStr.cap;
if (end > 0) {
str = new char[end];
for (int i = 0; i <= end; i++) {
str[i] = argStr.str[i];
}
}
}
return *this;
}
//默认构造函数
HSString::HSString() {
cap = 20;
end = 0;
str = '\0';
createdCount++;
currentCount++;
}
//析构函数
HSString::~HSString() {
delete[] str;
currentCount--;
}
//复制构造器
HSString::HSString(const HSString& argStr) {
cap = argStr.cap;
end = argStr.end;
if (end > 0) {
str = new char[end];
for (int i = 0; i <= end; i++) {
str[i] = argStr.str[i];
}
} else {
str = nullptr;
}
createdCount++;
currentCount++;
}
const HSString HSString::operator +(const HSString& strOne)const {
HSString temp;
temp.end = end + strOne.end;
temp.cap = cap + strOne.cap;
temp.str = new char[cap];
for (int i = 0; i < end; i++) {
temp.str[i] = str[i];
}
for (int i = 0; i <= strOne.end; i++) {
temp.str[i + end] = strOne.str[i];
}
return temp;
}
在向成员分配运算符返回深层副本之后,将执行错误。
我在字符串的末尾走了一段,以包含空终止符来清理动态创建的内存中的多余垃圾值。
使用三个概念的规则。
//示例:
int main() {
HSString greeting("Hello");
HSString name("Hayden");
HSString result;
vvvvvv //此语句执行后立即发生堆损坏vvvvvvv
result = greeting + name;
cout << result;
system("pause");
return 0;
}
答案 0 :(得分:1)
for (int i = 0; i <= end; i++)
这会产生溢出。因为在C ++数组中,如果声明一个包含5个元素的数组,则索引从0开始,索引范围是0到4。因此,如果创建大小为end
的数组,则索引的范围是0到结尾-1。您需要检查i < end
编辑:
尽管我不知道for (int i = 0; i <= strOne.end; i++)
HSString