newmin2018   4년 전

1991 번 Tree node를 class 로 생성하여 구현하였는데요. 

주석에 있는 delete [] tree를 하면  포인터를 힙에 반환할때  오류가 뜨더라구요 

얇은 복사 때문이라고 그러는더라구요. 얇은 복사 때문에 객체가 소멸된때 반환된 포인터를 한번더 주석 처리한 부분에서 반환하기 때문에 

없는 값을 반환하는거나 마찬가지라 하는데, 어디서 중복된 반환이 이루어졌는지 모르곘습니다.


깊은 복사생성자를 구현하거나 저부분을 주석처리하니 오류가 사라졌습니다.

복사생성자의 개념은 대충 알고있는데, 왜 저의 코드에서 포인터를 힙에 반환할때 문제가 발생한건지 간단하게 설명해주실분 있으신가요?

chogahui05   4년 전

좋은 질문이네요. 일단 아실 듯 싶은 지식을 다시 언급해 드리겠습니다.

new랑 delete는 쌍이 맞아야 한다.

malloc과 free는 쌍이 맞아야 한다.

tree는, stack에 할당된 친구입니다. 그 어디에서도 new로 할당된 적이 없습니다.

tree의 원소들은 주소를 가지고 있을 텐데. 그것들은 실 데이터를 가리키고 있고, 그 실 데이터들이 new로 할당된 것이겠죠.

그런데, 이 tree 배열을 왜.. delete로 지우시나요? 결국 이건 new로 할당받지도 않은 공간을 해제하려고 했는데..

왜 오류가 발생하냐는 것입니다.


이것은 delete[] tree 를 해도 마찬가지일 겁니다.

chogahui05   4년 전

그러면 해제하는 부분을 아래 소스처럼 바꿔 봅시다.

이 경우는 어떻게 동작할까요? tree[i]의 해당 객체는 new로 할당받았기 때문에, delete tree[i]라고 하면

new - delete 쌍이 맞게 됩니다.


추가로 부탁드릴 것이 있습니다. 깊은 복사생성자를 구현하거나 저부분을 주석처리하니 오류가 사라졌습니다..

혹시 깊은 복사 생성자를 구현했을 때 코드도 보여주실 수 있나요?

newmin2018   4년 전

안녕하세요

제가 말한 <깊은 복사생성자를 구현하거나 저부분을 주석처리하니 오류가 사라졌습니다..> 이부분을 정정합니다

주석 처리하니 오류가 사라졌습니다로 정정합니다.

비주얼에서 뜬 오류번호를 구글에 검색했을때 뜬 복사 생성자 오류와 번호가 같아서 제가 착각을 했던 것 같습니다.

말씀하신대로 이건 복사 생성자의 문제가 아니였고 new-delete의 쌍을 제가 잘못 구현한 것이 문제 였습니다.

보여주신 코드를 실행 해보고 복사생성자를 좀 더 찾아본 결과, 제가 쓴 코드에는 생성자 안에  자기 클래스에 대한 참조를 필요로하는 객체를 구현한 적이 없음을 알게 되어, 복사생성자와 이 오류는 연관이 없음을 알게 되었습니다...


해결해주셔서 감사합니다 ㅠ ㅠ

newmin2018   4년 전

덧붙여서 궁금한것이 있어 여쭙니다. 보여주신 2줄짜리 코드를 실행하지 않았을 때는, new만 해주고 delete를 해주지 않은 상황이 됩니다.

하지만 프로그램이 오류없이 돌아가긴 하였습니다. 

왜그런 건가요? delete 처리를 해주지 않아도 비쥬얼에서 메인함수가 종료 될때 자동으로 처리해 준걸까요?

tmdfur11   3년 전

동적할당한 객체를 delete 연산하여 소멸시키지 않아도 런타임중에는 문제를 일으키지 않는 것으로 알고 있습니다.

다만, 동적할당한 객체를 앞으로 사용할 일이 없음에도 불구하고 할당받은 것을 해제해주지 않게 되면 힙영역을 쓸데없이 할당받고 있게되어 메모리누수로 이어지게 되는 골치아픈 문제가 발생하게 됩니다.

댓글을 작성하려면 로그인해야 합니다.