C++/summary

소멸자 문제.

gandus 2010. 10. 4. 10:52

#include <iostream>

using namespace std;

 

class String {

           char *s;

public:

           String(char *p){                        // 깊은 복사가 이뤄짐

                     s = new char[strlen(p)+1];

                     strcpy(s, p);

           }

           ~String(){

                     cout << "String() 소멸자" << endl;   // 소멸자를 반드시.

                     delete[] s;

           }

};

 

class MyString : public String {

           char *header;

public:

           MyString(char *h, char *p) : String(p){

                     header = new char[strlen(h)+1];

                     strcpy(header, h);

           }

           ~MyString(){                 // 자신의 소멸자만 하면 부모는 자동으로 소멸된다.

                     cout << "MyString() 소멸자" << endl;

                     delete[] header;

           }

};

 

 

int main()

{

           cout << "자식 클래스 포인터 이용"<< endl;

           MyString *s1 = new MyString("//////", "Hello World!");

           delete s1;                    // 여기선 자식-> 부모가 지워진다.

           cout << endl;

   

           cout << "부모 클래스 포인터 이용"<< endl;

           String *s2 = new MyString("*****", "Hello World!");

           delete s2;         // 하지만 여기선 부모만 지워지게 된다.이렇게 되면 메모리 누수


          return 0;

}

 

그래서  


 

class String {

           char *s;

public:

           String(char *p){

                     s = new char[strlen(p)+1];

                     strcpy(s, p);

           }

           virtual ~String(){

                     cout << "String() 소멸자" << endl;

                     delete[] s;

           }

};

class MyString : public String {

           ...// 앞과 동일

};