C언어, Queue, pop() 구현하던 도중 shallow copy와
비슷한 문제 발생
내가 구현해본 pop은 첫번째 노드의 데이터를 리턴함과 동시에 Queue 에서 제거하는 함수로
1. char * Data 에 첫번째 노드 데이터를 복사하고 그걸 나중에 리턴한다
2. Queue의 Head가 첫번째 노드의 다음 주소를 임시 노드에 담아둔다
3. 첫번째 노드를 free 해준다
4. Queue 사이즈 1 감소시킨다
5. 첫번째 노드에 임시노드에 적혀있던 주소를 담는다, 이로써 다음 노드가 첫번째 노드가 된다
6. 데이터를 리턴한다
그러나 1번 char * Data 에 첫번째 노드 데이터를 담고 그걸 나중에 리턴할때 쓰레기값 또는 이상한 값이 출력 됐다.
원인
데이터를 복사한게 아닌, 데이터(char 배열)의 주소를 복사하게 됐다
C++ 에서는 동일한 클래스 타입의 두개의 인스턴스가 존재할때 복사 생성자를 통해서, 인스턴스가 가지고 있는 데이터들을 다른 인스턴스에 복사할 수 있다, 문제는 이때 컴파일러가 만들어주는 기본 복사 생성자를 쓰게되면, 순수하게 데이터 변수들의 값만 복사하게 되고, 주소를 가지고 있는 타입도, 주소를 복사 하게 된다, 그리고 두개의 데이터가 동일한 주소를 가리키는 사태가 벌어진다. 이렇게 되면 원본이던 사본이던 간에 어느 한쪽이 소멸되어 주소가 사라지면, 복사 받은 쪽에서도 주소가 사라져서 결국 이상한 주소를 가리킨다.
그리고 실제로 196번 라인에서 _pQueue->pHead 의 메모리를 해제할때
_pQueue->pHead->data 조차 사라지며, 그걸 담아 뒀던 char* Data 도 사라진 주소를 가리켜 결국
이상한 주소를 가리키게 됐다
해결
pop의 인자로 배열을 input 으로 넣고 해당 배열에 data를 복사하도록, 그리고 주소를 대입하는게 아닌, strcpy_s를 사용해 실제 문자열을 복사하도록 했다
이후 pop한 데이터가 쓰레기 값을 출력하는 사태는 없어졌다.
'C++ > Error, Exception, 주의' 카테고리의 다른 글
member initializer list 사용시 주의 (0) | 2020.03.17 |
---|---|
주의_1 while 문 안에 switch를 사용할 때 (0) | 2020.03.07 |
EX02 HEAP CORRUPTION DETECTED (0) | 2020.03.07 |
EX01_읽기 엑세스 위반 (0) | 2020.03.07 |