오늘은 지루했고 나 자신의 작은 문자열 클래스를 만들고 싶습니다. NET에서 'System.String'클래스를 정말 좋아해요. 스플릿/바꾸기/제거 등의 기능을하고 있습니다. 구현하려고합니다.사용자 정의 문자열 클래스 및 소멸자?
그러나 내 문제는 소멸자입니다. 동일한 문자열을 보유하고있는 문자열 클래스의 인스턴스가 여러 개있는 경우 소멸자가 호출 될 때 같은 메모리를 모두 삭제하려고합니다. 예를 들어
:
void DoSomething() {
MyStringClass text = "Hello!";
{
MyStringClass text2 = text;
// Do something with text2
} // text2 is destroyed, but so is the char* string in memory
// text now points to useless memory??
}
오전 나는이 권리를 이해? Lol.
감사합니다,
알렉스
편집 : 당신이 올바른지
class string {
unsigned int length;
char* text;
public:
string() : length(0), text(NULL) { }
string(const char* str) {
if (!str) throw;
length = strlen(str);
text = new char[length];
memcpy(text, str, length);
}
~string() {
delete[] text;
}
};
관련 코드를 표시하지 않았기 때문에 말하기가 불가능합니다. 그러나 [Three of Rule] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)에 관해 읽어야합니다. –
동일한 const char *로 구성된 여러 문자열이있는 경우 저장소와 memcpy를 명시 적으로 새로 만들기 때문에 동일한 저장소를 공유하지 않습니다. 그러나 문자열을 복사하거나 지정하면 동일한 저장소가 생성되고 둘 다 동일한 저장소를 삭제하려고 시도합니다. 왜냐하면 위에서 제안한 것처럼 3 가지 규칙을 읽으므로. – abarnert
추신 : 3 규칙을 따르는 일반적인 방법은 모두 3 개를 정의하는 것입니다. 그러나이 경우에는 복사가 불가능하고 소멸자가있는 문자열 홀더 클래스를 사용하여 문자열 홀더를 다르게 사용하는 문자열 클래스를 만들 수 있습니다 (문자열 소유자를 멤버로 사용하여 딥 복사하고 방금 shared_ptr 등)을 정의 할 필요가 없습니다. –
abarnert