我不知道为什么会发生堆损坏(关于内存分配问题)
I don't know why it occurs heap corruption(about memory allocation problem)
这是课程的项目之一,其目标是制作完整的 MyString Class。在制作析构函数方法之前,它运行良好。但是在 main.cpp 中,当我尝试使用我制作的这些方法时,它发生了堆损坏。我以为问题出在调用析构函数的顺序上,但我不知道它发生在哪里。
尝试检查分配的内存(反转调用顺序)
没有析构方法的处理(有效)
main.cpp
void main() {
MyString a = MyString("HELLOMYNAMEIS");
char ab[10] = "thisiskrw";
MyString c = ab;
a = a + c;
cout << a;
}
MyString.cpp
MyString::~MyString() {
delete[] str_;
}
MyString operator+(const MyString& lhs, const MyString& rhs) {
MyString a(lhs);
MyString b(rhs);
a += b;
cout << a;
return a;
}
MyString& MyString::operator+=(const MyString& str) {
int i = 0;
if (this->capacity() < (this->length_ + str.length_)) {
char* temp = new char[this->length_ + str.length_+1];
memset(temp, '[=11=]', this->length_+str.length_+1);
strcpy(temp, this->str_);
for (int i = 0; i < str.length_; i++) {
temp[(this->length_) + i] = str.str_[i];
}
temp[this->length_ + str.length_] = '[=11=]';
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
}
else {
for (int i = 0; i < str.length_; i++) {
this->str_[(this->length_) + i] = str.str_[i];
}
this->length_ = this->length_ + str.length_;
}
return *this;
}
它将在 MyString 对象中打印字符串。
您忘记在任何地方写 this->str_ = temp;
。您只需尝试将较长的字符串写入较短的 space.
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
应该是
delete [] this->str_;
this->str_ = temp;
这是课程的项目之一,其目标是制作完整的 MyString Class。在制作析构函数方法之前,它运行良好。但是在 main.cpp 中,当我尝试使用我制作的这些方法时,它发生了堆损坏。我以为问题出在调用析构函数的顺序上,但我不知道它发生在哪里。
尝试检查分配的内存(反转调用顺序) 没有析构方法的处理(有效)
main.cpp
void main() {
MyString a = MyString("HELLOMYNAMEIS");
char ab[10] = "thisiskrw";
MyString c = ab;
a = a + c;
cout << a;
}
MyString.cpp
MyString::~MyString() {
delete[] str_;
}
MyString operator+(const MyString& lhs, const MyString& rhs) {
MyString a(lhs);
MyString b(rhs);
a += b;
cout << a;
return a;
}
MyString& MyString::operator+=(const MyString& str) {
int i = 0;
if (this->capacity() < (this->length_ + str.length_)) {
char* temp = new char[this->length_ + str.length_+1];
memset(temp, '[=11=]', this->length_+str.length_+1);
strcpy(temp, this->str_);
for (int i = 0; i < str.length_; i++) {
temp[(this->length_) + i] = str.str_[i];
}
temp[this->length_ + str.length_] = '[=11=]';
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
}
else {
for (int i = 0; i < str.length_; i++) {
this->str_[(this->length_) + i] = str.str_[i];
}
this->length_ = this->length_ + str.length_;
}
return *this;
}
它将在 MyString 对象中打印字符串。
您忘记在任何地方写 this->str_ = temp;
。您只需尝试将较长的字符串写入较短的 space.
strcpy(this->str_,temp);
this->length_ = this->length_ + str.length_;
delete[] temp;
应该是
delete [] this->str_;
this->str_ = temp;