2012-06-05 3 views
0

오늘은 지루했고 나 자신의 작은 문자열 클래스를 만들고 싶습니다. 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; 
    } 
}; 
+7

관련 코드를 표시하지 않았기 때문에 말하기가 불가능합니다. 그러나 [Three of Rule] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)에 관해 읽어야합니다. –

+0

동일한 const char *로 구성된 여러 문자열이있는 경우 저장소와 memcpy를 명시 적으로 새로 만들기 때문에 동일한 저장소를 공유하지 않습니다. 그러나 문자열을 복사하거나 지정하면 동일한 저장소가 생성되고 둘 다 동일한 저장소를 삭제하려고 시도합니다. 왜냐하면 위에서 제안한 것처럼 3 가지 규칙을 읽으므로. – abarnert

+1

추신 : 3 규칙을 따르는 일반적인 방법은 모두 3 개를 정의하는 것입니다. 그러나이 경우에는 복사가 불가능하고 소멸자가있는 문자열 홀더 클래스를 사용하여 문자열 홀더를 다르게 사용하는 문자열 클래스를 만들 수 있습니다 (문자열 소유자를 멤버로 사용하여 딥 복사하고 방금 shared_ptr 등)을 정의 할 필요가 없습니다. – abarnert

답변

1

- 모두 동일한 메모리를 delete []을 시도합니다 :

아차, 내가 코드를 포함하는 것을 잊었다 블록.

클래스의 복사 생성자를 정의하지 않았으므로 포인터의 단순 복사본을 수행하는 기본 생성자를 얻습니다.

text2이 범위를 벗어나면 포인터는 delete [] d가됩니다. text1이 범위를 벗어나면 동일한 포인터가 다시 delete []d가되어 정의되지 않은 동작이 발생합니다.

이 문제를 해결할 수있는 방법은 많습니다. 가장 간단한 방법은 복사 생성자와 할당 연산자를 정의하는 것입니다.