c&c++

C/C++ 메모리 오류에 대해서(작은 실수하나가...??)

sieunju 2017. 1. 2. 01:07
반응형


제가 어떤 프로젝트를 진행하면서 메모리 생성하고 해제 하는 부분에서 정말 애를 많이 먹고 있어서 계속해서 

그것을 해결하려고 노력하다가 근본적인 문제가 무엇인지에 대해서 찾아보고 공부하기로 마음 먹었습니다. 

문제 화면은


대충 해석하자면 메모리 힙에서 블럭이 걸렸다? (제 나름 해석입니다..ㅎㅎ;)

처음에 저는 이 문제를 보고 메모리 해제를 내가 잘못했구나 라고 생각하고 오류의 내용을 자세히 읽지 않은체

오로지 delete(메모리 해제) 에 대해서만 찾아봤습니다. 


하지만 절대 풀리지가 않았습니다. 


그 문제의 소스는 아래에 있습니다.


현재 사용하고있는 코드 일부분에서 가져온거라서 어떤식으로 메모리를 설정하고 해재했는지만 알면 될거 같습니다. 

whcar_t의 크기를 지정해주고 메모리를 0으로 깔끔하게 셋팅한후

메모리를 복사했습니다. 

그 후에 _charBuffer의 크기에 0을 추가하고 _charBuffer + 1크기에 0의 값을 넣었습니다.

(이유는 문자를 인코딩할때 맨 마지막에 쓰레기 값이 추가적으로 들어가서 일부러 이렇게 코딩했습니다.)


제가 여기서 큰실수를 하나 저질렀는데 그것에 대해서 찾던 도중


http://diehard98.tistory.com/entry/CC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%A4%EB%A5%98%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC


이분 블로그를 보고나서 알았습니다. 


블로그에 내용을 간단히 말하자면


C/C++ 에서 메모리 해제시 오류가 생기는 원인으로는 


1. 이미 해제된 메모리를 다시 해제할때

2. 할당 된적도 없는 메모리 해제 할라고 할때

3.이미 해제된 메모리 영역에서 뭔가 데이터를 쓰려고 할때

4.할당된적이 없는 메모리에 뭔가 데이터를 쓰려고 할때

5.할당된 크기의 메모리의 양보다 더 많은 데이터를 집어 넣으려고 할때.


제가 실수한 부분이 5번입니다. 메모리크기를 new로 통하여 정했는데 그후에 크기 이상으로 0의 값을 넣었습니다.

문제는 여기서 잘못됐습니다. ㄷㄷ;;


/*

_charBuffer = new wchar_t[(_bufferSize/2)];

↓↓수정 후↓↓

_charBuffer = new wchar_t[(_bufferSize/2) + 2];

*/


위와 같은 방법으로 애초에 먼저 크기 2를 추가 하면은 문제는 해결이 됩니다. 


이상 포스팅을 마치도록 하겠습니다. 


감사합니다.











반응형