나는 이것을 몇 시간 동안 알아 내려고 노력해 왔으며, 나는 지혜로 끝까지 노력하고 있습니다. 누군가 내가 잘못하고 있다고 말할 수 있다면 분명 감사 할 것입니다.연산자를 구현할 때 delete [] (힙 손상) 사용 =
문자열의 기본 기능을 에뮬레이트하기위한 간단한 클래스를 작성했습니다. 클래스의 멤버는 문자 포인터를 (동적으로 생성 된 문자 배열을 포인트) 데이터 및 정수 strSize 포함 (문자열, 산세 터미네이터의 길이를 보유하고 있습니다.)
나는 새로운 을 사용하고 있기 때문에 및 을 삭제하면 복사 생성자 및 소멸자가 구현되었습니다. 내 문제는 연산자 + =을 구현하려고 할 때 발생합니다. 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
은 여기 내 전체 클래스와 테스트 프로그램입니다.
이것은 몇 가지 분명한 질문 또는 '숙제'태그를 요구합니다. – sbi