Я пытаюсь понять это часами, и я нахожусь в конце. Я, безусловно, был бы признателен, если бы кто-то мог сказать мне, когда я делаю что-то не так.
Я написал простой класс для эмуляции базовой функциональности строк. Члены класса включают в себя символьный указатель data (который указывает на динамически создаваемый массив символов) и целое число strSize (которое содержит длину строки, без терминатора.)
Поскольку я использую new и delete , я реализовал конструктор копирования и деструктор. Моя проблема возникает, когда я пытаюсь реализовать оператор + = . Объект LHS создает новую строку правильно - я даже могу напечатать ее с помощью cout - но проблема возникает, когда я пытаюсь освободить указатель данных в деструкторе: я получаю «Обнаружено повреждение кучи после нормального блока» по адресу памяти, указанному на с помощью массива data деструктор пытается освободить его.
Вот мой полный курс и тестовая программа:
#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.