2011. 3. 4. 23:23
생성자와 동적할당

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

const int SIZE=20;

class Person
{
 char *name;
 char *phone;
 int age;

public:
 Person(char* _name, char* _phone, int _age);
 void ShowData();

};
Person::Person(char* _name, char* _phone, int _age)
{
 
name = new char[strlen(_name)+1];
 strcpy(name, _name);
 phone = new char[strlen(_phone)+1];
 strcpy(phone, _phone);
 age = _age;
}

void Person::ShowData()
{
 cout<< " name: "<<name<<endl;
 cout<< " phone: " <<phone<<endl;
 cout<< " age: " << age<<endl;
}

int main()
{
 Person p("KIM", "013-113-1113 ", 22);
 p.ShowData();
 return 0;
}


결과적으로 객체 p는 main함수 내에서 생성되었으므로, 스택(stack)영역에 할당이 되겠지만, 생성자 내에서 메모리 공간을 동적을 할당하고 있기 때문에, 멤버 변수 name과 phone이 가리키는 메모리 공간은 힙(heap)이 된다.

=>이러한 형태의 초기화가 주는 이점은 메모리 공간을 효율적으로 사용할 수 있다는 것이다.


!!!문제 :!! 메모리 누수(유출)현상
=>해결 ? 소멸자에서 동적 해체!(delete)

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

const int SIZE=20;

class Person
{
 char *name;
 char *phone;
 int age;

public:
 Person(char* _name, char* _phone, int _age);
 
~Person();
 void ShowData();

};
Person::Person(char* _name, char* _phone, int _age)
{
 name = new char[strlen(_name)+1];
 strcpy(name, _name);
 phone = new char[strlen(_phone)+1];
 strcpy(phone, _phone);
 age = _age;
}

Person::~Person()
{
 
delete []name;
 delete []phone;
}

void Person::ShowData()
{
 cout<< " name: "<<name<<endl;
 cout<< " phone: " <<phone<<endl;
 cout<< " age: " << age<<endl;
}

int main()
{
 Person p("KIM", "013-113-1113 ", 22);
 p.ShowData();
 return 0;
}

!!!!!생성자 내에서 메모리를 동적 할당하는 경우, 이를 해제하기 위해서 반드시 소멸자를 정의해야 한다.!!




Posted by Triany