我已经尝试解决这个问题好几个小时了,但我已经束手无策了。如果有人能在我做错时告诉我,我一定会很感激。
我编写了一个简单的类来模拟字符串的基本功能。该类的成员包括一个字符指针数据(它指向一个动态创建的字符数组)和一个整数strSize(它保存字符串的长度,没有终止符。)
由于我使用的是new和delete,因此我已经实现了复制构造函数和析构函数。当我尝试实现operator+=时,会出现我的问题。LHS 对象正确构建了新字符串——我什至可以使用 cout 打印它——但是当我尝试在析构函数中释放数据指针时出现问题:我在指向的内存地址处得到“在正常块后检测到堆损坏”通过数据数组析构函数试图解除分配。
这是我完整的课程和测试程序:
#include <iostream>
using namespace std;
// Class to emulate string
class Str {
public:
// Default constructor
Str(): data(0), strSize(0) { }
// Constructor from string literal
Str(const char* cp) {
data = new char[strlen(cp) + 1];
char *p = data;
const char* q = cp;
while (*q)
*p++ = *q++;
*p = '\0';
strSize = strlen(cp);
}
Str& operator+=(const Str& rhs) {
// create new dynamic memory to hold concatenated string
char* str = new char[strSize + rhs.strSize + 1];
char* p = str; // new data
char* i = data; // old data
const char* q = rhs.data; // data to append
// append old string to new string in new dynamic memory
while (*p++ = *i++) ;
p--;
while (*p++ = *q++) ;
*p = '\0';
// assign new values to data and strSize
delete[] data;
data = str;
strSize += rhs.strSize;
return *this;
}
// Copy constructor
Str(const Str& s)
{
data = new char[s.strSize + 1];
char *p = data;
char *q = s.data;
while (*q)
*p++ = *q++;
*p = '\0';
strSize = s.strSize;
}
// destructor
~Str() { delete[] data; }
const char& operator[](int i) const { return data[i]; }
int size() const { return strSize; }
private:
char *data;
int strSize;
};
ostream& operator<<(ostream& os, const Str& s)
{
for (int i = 0; i != s.size(); ++i)
os << s[i];
return os;
}
// Test constructor, copy constructor, and += operator
int main()
{
Str s = "hello"; // destructor for s works ok
Str x = s; // destructor for x works ok
s += "world!"; // destructor for s gives error
cout << s << endl;
cout << x << endl;
return 0;
}
编辑:加速 C++ 问题 12-1。