• [ETC] C++ 컴파일러도 못말리는 삽질코드2012.01.28 PM 12:07

게시물 주소 FONT글자 작게하기 글자 키우기


#include <iostream>
using namespace std;
int main()
{
int *pnInt, nInt = 7;
while(pnInt != NULL)
{
pnInt = new int;
*pnInt = nInt;
nInt++;
}
return 0;
}


보통 IDE에서 컴파일러를 이용해 컴파일 하고 IDE내에서 프로그램을 실행하면
무한루프나 메모리 누수 같은것들도 구별해 내고 알아서 튕겨주는데..
저 코드는 보다시피 보기에는 멀쩡하기에
돌려보면 어떨까 하여 돌려보니.
예상 이상의 효과를 보여주더란 말.
(장시간 작성하고 세이브도 안하고 있던 워드파일을
그냥 삽질 한번 했다가 날아가 버릴 뻔했음.. --)


저장을 자주 합시다~ 그리고 심심한 사람들은 저 코드 돌려보고
시스템이 어느 정도까지 버티는지, 얼만큼 빨리 퍼지는지 시간을
재어보는것도 재미있을듯!

댓글 : 12 개
생각해보면, c컴파일러는 힙영역 해제를 안해도 정상적으로 컴파일이 되다보니
큰 단점이면서 장점인건 어쩔수가 없는듯...
루저國// 보통 프로그램 짜다 보면 에러 발견하기 귀찮을때 컴파일 하고 실행해서 에러를 찾기도 하는데, C에서는 좀 조심해야 하겠더군요. o_o
valgrind
포주// 뭔가 해서 찾아봤더니 저런것도 있었네요^^
저건 그냥 무한루프네요.
무한루프는 당연히 시스템이 못 견딜때까지 도는거죠.
무한루프 빠져나가는 로직도 없이 무제한으로 메모리 잡았으니 버틸때까지 계속 도는거죠
윈도우에서도 응답없음 상태에 빠지는 프로그램들이 대부분 무한루프 빠지는 경우입니다
그걸 컴파일러가 잡아준다는건 어불성설입니다.. 알아서 잘 짜야겠지요
그리고 C나 C++이나 C#이나 C 관련 코더라면 메모리 잡으면 해제는 당연히 해야지요
저런식으로 무분별하게 메모리 잡고 메모리 주소까지 잃어버리게 짜는 분도 있을지.. 자바라면 모르겠네요. 지가 알아서 해제하니..

참고로 pnInt라는 변수는 단순한 포인터 변수일뿐이며 메모리 잡고 리턴된 메모리 주소를 가지고 있을뿐입니다. 무한루프 돌면서 새로운 메모리 잡은 새로운 주소를 저장할뿐인거죠. 소스상의 결함은 없습니다. 메모리 포인터 변수에 메모리 주소 넣은것일뿐이므로.. 해제는 알아서 하셔야죠....

현직 6년차 C++ 프로그래머인데 솔직히 현업에서 메모리 릭을 못 잡는 분은 없을 듯 하네요. 별도의 라이브러리까지 넣어가면서 잡을거라면 메모리를 쓰지 않고 지역변수나 배열에 담는게 낫겠죠.. 함수 빠져 나가면 없어지도록.. 메모리 잡으면 해제는 당연한 것. 자바하다가 넘어온 분은 잘 못 하긴 하더군요.
C#이면 unsafe 말고는 메모리 잡고 굳이 해제할 필요가 없을텐데요...
청소부 때문에 C# 쓰는거 아닌가요? ㅠ
저런 소스는 그냥 메모리 잡기 전에
if(pnInt) delete pnInt;
이거 한줄 넣으면 끝..
배열이든 리스트든 어딘가에 주소를 전부 담아두고 루프 빠져나오고 나중에 한번에 해제하던지..
unsafe 때문에 C#도 이야기한겁니다.
C# 자체는 애초에 메모리 핸들링이 힘들긴 하죠
릭도 릭이지만 애초에 논리적으로 잘못된 코드네요.
널초기화 하는곳이 한군데도 없는데 while 조건을 저런식으로 하니....
슴세경♡// 프로그래머도 사람이니 실수할때가 있겠죠. 흐흐.. ex) 윈도우즈 ME !
지라스 // 신텍스만 놓고 보면 에러는 없긴 하죠, 단지 while 루프에 한번 빠지면 메모리를 끝없이 축낸다는게 문제지만.. 흐흐, 저 코드야 뭐 단순히 극단적인 예의 경우고.. 코드가 길어지면 프로그래머도 실수할때가 있는데 그래도 그런 문제를 분석할수 있는 툴이 있군요. 윗분이 언급한 valgrind 라는 건 오늘 처음 알았음.
ctrl + break
친구글 비밀글 댓글 쓰기

user error : Error. B.