#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 {
...// 앞과 동일
};