1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 깊은 복사 - 복사에 의해 실제로 두 개의 값이 생성되는 것 얕은 복사 - 대상이 되는 값은 여전히 하나뿐인데 접근 포인터만 둘로 늘어나는 것 #include "stdafx.h" #include <iostream> using namespace std; //얕은 복사 기본 정의(?)// int _tmain(int argc, TCHAR* argv[]) { //대상이 하나 int nScoreData = 10; int *pA, *pB; //하나의 대항을 향해 접근 포인터가 둘로 늘어남 pA = &nScoreData; pB = &nscoreData; return 0; } ////////////////// //얕은 복사의 문제점// ///////////////// int _tmain(int argc, TCHAR* argv[]) { int *pA, *pB; pA = new int; *pA = 10; pB = new int; pB = pA; //얕은 복사의 표본(?) cout << *pA << endl; cout << *pB << endl; delete pA; delete pB; return 0; } - 얕은 복사로 인하여 하나의 동적 생성된 인스턴스에 접근 포인터가 2개로 늘어 난 상태에서 메모리 해제를 해버리면 이미 해제가 된 상태인데 또 해제를 할려고 하니 에러가 발생됨 - 또한 pB가 생성한 인스턴스는 접근 불가능한 상태가 되버린다 - 그래서 포인터가 가리키는 주소를 변경 하는게 아니라 포인터가 가리키고 있는 메모리의 내용을 복사 해야 됨. pB = pA; //얕은 복사의 표본(?) 이 형태를 변형 해야 한다. *pB = *pA; //포인터가 가리키고 있는 메모리의 내용(값)을 복사 이렇게 복사를 하게 되면 메모리 해제를 하더라도 동적으로 생성된 모든(pA,pB) 인스턴스가 정상적으로 해제가 된다. | cs |
깊은 복사와 얕은 복사
2018. 3. 23. 17:07