class CObj
{
private:
char* m_pName;
//같은 공간을 참조하는 객체의 숫자를 새기위한 정적변수
static int m_iCnt;
public:
void Render(void)
{
cout << m_pName << endl;
}
public:
CObj(char* pName)
{
m_pName = new char[strlen(pName) + 1];
strcpy_s(m_pName, strlen(pName) + 1, pName);
}
CObj(CObj& rObj)
{
++m_iCnt; //복사생성자 호출될때 마가 카운트 증가
m_pName = rObj.m_pName;
}
~CObj(void)
{
if(m_pName != NULL)
{
if(m_iCnt == 0) // 0이되면 해당heap공간 참조하는 객체가 1개 있다는 뜻 으로 지워도 노상관
{
delete[] m_pName;
m_pName = NULL;
}
else
{
--m_iCnt; // 해당공간 참조객체가 2개이상이여서 이럴때는 카운트 감소
}
}
}
};
int CObj::m_iCnt = 0;
void main(void)
{
CObj obj("NAM");
obj.Render();
CObj obj2(obj);
obj2.Render();
// 기본복사생성자 만 있을때의 문제점은
//Heap 공간에 할당은 한번되는데 obj 와 obj2객체가 같은 포인터 공간을 가리키고 있기때문에
//obj 의 공간이 해제되고 나서 obj2의 공간이 해제하려고 할때 해제할 공간이 없으므로 오류가 난다
}
///////////////////////////////////////////////////
class CTest
{
private:
char* m_pName;
public:
void Render(void)
{
cout << m_pName << endl;
}
public:
CTest(char* pName)
{
m_pName = new char[strlen(pName) + 1];
strcpy_s(m_pName, strlen(pName) + 1 , pName);
}
//공간을 새로 할당해서 서로 다른공간을 가리켜서 깊은 복사로 문제를 해결한다
CTest(CTest& rTest)
{
// 이런식의 명시적으로 복사생성자를 구현해서 같은 공간이 여러번 삭제되는 일이 없도록 해야한다
m_pName = new char[strlen(rTest.m_pName) + 1];
strcpy_s(m_pName, strlen(rTest.m_pName) + 1, rTest.m_pName);
}
~CTest(void)
{
if(m_pName != NULL)
{
delete m_pName;
m_pName = NULL;
}
}
};
void main(void)
{
CTest test("Nam");
test.Render();
CTest test2(test);
test2.Render();
}
댓글