[C++] char* num = new char; 로 선언한 변수는 어떻게 delete 해야 하나요?
문자열을 출력하거나 파라미터로서 사용해야 하는데,
int형 숫자를 문자열에 붙였다 바꿨다 해주어야 할 필요가 있어 다음과 같은 코드를 사용했습니다.
int value = 10;
char* num = new char;
sprintf(num, "%04d", value);
그리고 이렇게 숫자로부터 변환된 문자열을
char str[100] 으로 선언된 문자열에 strcpy로 붙이기도 하고 쓰는 건 별 문제가 없었는데요...
문제는 모듈 종료시
delete num; 하니까 아래와 같은 에러가 발생하네요. delete [] num;도 마찬가지입니다.
Windows has triggereda breakpoint in MYPROGRAM.exe.
This may be due to a corruption of the heap, which indicates a bug in MYPROGRAM.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while MYPROGRAM.exe has focus.
The output window may have more diagnostic information.
도저히 해결방법을 모르겠어서 그냥 프로그램종료되면 알아서 메모리 놓으니까 놔두자~ 하고 만들었다가
왜 new 써놓고 해제 안하냐고 혼났지요 ㅡ_ㅜ;;
조언 좀 주시면 감사하겠습니다..
할당한 메모리 영역 이상으로 메모리를 사용했기 때문입니다.
두번째 줄 메모리 할당 자체는 문제가 없으나, 세번째 줄에서 할당받은 메모리 이상을 사용하는 것이 문제입니다. 1바이트만 할당해놓고 5바이트를 사용하고 있거든요. 디버그 버전 CRT의 경우 동적 할당하는 메모리 영역 앞뒤로 특수한 처리를 해주고 있고, 메모리 오버런 등으로 그 부분이 바뀌어있을 경우 해제시에 에러를 출력해줍니다. 딱히 쓸모가 없어보이는 경우에도 메모리 클린업 부분을 정확히 구현해주어야 하는 이유이기도 합니다. 이번 예에서도 직접 delete를 하지 않고 그냥 프로세스가 종료되게 놔뒀다면 힙 커럽션 문제를 발견하기 어려웠겠죠.
이걸 제대로 해결하고 넘어가지 않으면 결국 엉뚱한 곳에서 괴상한 런타임 에러가 발생할 것입니다. 차라리 죽어버리면 괜찮은데, 조용히 다른 변수의 값을 바꿔버리든지 하는게 제일 무섭습니다.
해결방법은 당연히 메모리를 정확하게 할당해주는 것입니다. 위 예에서는 5바이트 이상이 할당되어야 합니다. 그러면 delete에서도 에러가 발생하지 않을 겁니다. 또한 sprintf는 (C++ 템플릿 버전이 아니라면) 버퍼의 크기를 전달받지 않기 때문에 가급적 사용하지 않는 것이 좋습니다.
--
좋은 말씀 감사합니다.
%04d 가 4개문자 + NULL이어서 5바이트를 사용한다고 하시는 것 같은데요.
그렇다면 제가 일일이 int가 몇자리 수인지 확인해서 그에 맞는 사이즈로 동적할당을 해야만 하는 건가요?
구현이 어려운 건 아닌데 코드가 점점 길어지니 지저분해지네요;
toString(int) 이런식으로 된 함수는 없을까요?
단, 문자열에 붙였다 떼었다 할 수 있는 것으로...
우선 문자열을 char로 받겠다는거 자체가 틀린
우선 문자열을 char로 받겠다는거 자체가 틀린 발상이구요...
이경우 동적할당으로 해결하려면 new char가 아니라 new char[길이] 이렇게 하고 delete[]로 해제해야겠죠.
보통 C에서 이런 경우는 적당히 넉넉한 길이로 버퍼를 만들어서 사용합니다.
말씀하신대로 일일이 자릿수를 세서 할당하는 건 번거롭고 반복되는 성능도 떨어지니까요.
그런데 new/delete를 쓴다면 C가 아니라 C++이라는 거고, 그럼 애당초 char[]를 쓸 필요가 없습니다.
문자열은 std::string을 쓰면되고, 숫자를 문자열로 바꿀때에는 stringstream을 쓰거나 C++11을 지원하는 환경이라면 std::to_string함수를 이용하면 됩니다.
...
저 상황에서 혼낸 분이 "왜 new 하고 해제 안하냐고" 혼냈다는 게 더 무서운데요. -_-
(...사자가 새끼 키우듯이 절벽에서 떨어뜨린 담에 살아서 올라오나 보는 스타일인가...)
Re :
다른 곳에도 delete 안한 게 많아서 ㅡㅡ;;;
댓글 달기