본문 바로가기
IT 컴퓨터_프로그램 /c++

깊은복사 얕은복사

by 건축직일상 2015. 10. 6.

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();

}

'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글

캐스팅연산  (0) 2015.10.12
클래스_상속  (0) 2015.10.12
static  (0) 2015.10.06
함수 오버로딩  (0) 2015.10.05
const  (0) 2015.10.05

댓글