는 mc 라는 포인터에 MyClass의 메모리를 동적으로 할당 하는것입니다.
나중에 꼭 할당한 메모리를 클래스 사용이 끝나면
delete mc;
이렇게 수동으로 해제 해줘야합니다. 안그러면 프로그램이 돌아가는중에
필요없는 메모리를 계속잡고 있게되어 시스템의 사용가능한 메모리가
줄어들게 되겠죠.
MyClass mc;
이건 컴파일타임시에 클래스의 영역이 정적으로 할당되며
프로그램이 종료하면 자동으로 사라집니다.
큰 프로그램을 짤때 많은 데이터들이 메모리에 할당되고 해제되야되는데
후자의 방식을 쓰면 쓸데없이 많은 메모리를 프로그램 종료시까지
소비하게 되므로 전자처럼 필요할때 메모리를 동적으로 할당받고
필요없어지면 해제하는 방식으로 프로그래밍하게 되는거죠
라고하면, mc라는 포인터변수는 stack에 할당됩니다. 당연히 mc라는 포인터는 함수가 종료하면 사라집니다. 반면에 이 포인터가 가리키는 실제 객체는 Heap에 생성되어서, 명시적으로 "delete" 해주거나 프로그램이 종료할때까지 메모리에 존재합니다.
포인터가 스택에 있기때문에, 함수가 종료하기 전에 "delete mc" 로 객체를 제거해야합니다. 혹은 함수가 종료하기 전에 "anotherPointer = mc" 같이 해서 class의 멤버나 전역변수에 포인터값을 복사한다면, 함수가 종료한 후에도 객체를 제거할 수 있겠죠.
new를 통해 객체를 만들때 항상 delete하는 코드도 같이 작성하시길 바랍니다. 까먹거든요...
MyClass mc;
이렇게 하면 객체 자체가 스택에 생성되지요, delete를 해줄필요가 없고 함수가 끝나면 없어집니다. 함수안에서 지역적으로 이용할때는 이렇게 스택에 잡아버리면 속편하지요.
stdauto_ptr 보다는 boostscoped_ptr이나 boostshared_ptr을 추천합니다.
stdauto_ptr의 경우는 소유권 이전 시에 여러가지 모호한 상황이 발생할 수 있기 때문에 잘 모르고 사용하면 위험한 class라고 할 수 있구요
boost library의 boostscoped_ptr은 소유권 이전이 막혀져 있기 때문에 위험성이 적고 좀 더 가볍습니다.
boostshared_ptr은 이것보단 좀더 무겁지만 reference counting이 되는 smart pointer이기 때문에 heap에 할당된 객체들을 container에서 관리할 때 등의 다양한 상황에 적용할 수 있습니다.
또 release 시에 delete operator 말고 다른 function을 호출하도록 지정해 줄 수 있기 때문에 다음과 같은 경우에도 편리하게 사용가능합니다.
동적으로 메모리를 할당하느냐 아니냐의 차이입니다.
MyClass *mc = new MyClass;
는 mc 라는 포인터에 MyClass의 메모리를 동적으로 할당 하는것입니다.
나중에 꼭 할당한 메모리를 클래스 사용이 끝나면
delete mc;
이렇게 수동으로 해제 해줘야합니다. 안그러면 프로그램이 돌아가는중에
필요없는 메모리를 계속잡고 있게되어 시스템의 사용가능한 메모리가
줄어들게 되겠죠.
MyClass mc;
이건 컴파일타임시에 클래스의 영역이 정적으로 할당되며
프로그램이 종료하면 자동으로 사라집니다.
큰 프로그램을 짤때 많은 데이터들이 메모리에 할당되고 해제되야되는데
후자의 방식을 쓰면 쓸데없이 많은 메모리를 프로그램 종료시까지
소비하게 되므로 전자처럼 필요할때 메모리를 동적으로 할당받고
필요없어지면 해제하는 방식으로 프로그래밍하게 되는거죠
제가 알기로
MyClass *mc = new MyClass; 는 힙에 잡히고
MyClass mc; 는 스택에 잡힌다고 알고 있습니다.
고로 new로 잡은넘은 적절한때에 delete를 해줘야 겠지요.
맞는지 모르겠군요 -_-;
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
Re: class 기초질문
MyClass *mc = new MyClass;
라고하면, mc라는 포인터변수는 stack에 할당됩니다. 당연히 mc라는 포인터는 함수가 종료하면 사라집니다. 반면에 이 포인터가 가리키는 실제 객체는 Heap에 생성되어서, 명시적으로 "delete" 해주거나 프로그램이 종료할때까지 메모리에 존재합니다.
포인터가 스택에 있기때문에, 함수가 종료하기 전에 "delete mc" 로 객체를 제거해야합니다. 혹은 함수가 종료하기 전에 "anotherPointer = mc" 같이 해서 class의 멤버나 전역변수에 포인터값을 복사한다면, 함수가 종료한 후에도 객체를 제거할 수 있겠죠.
new를 통해 객체를 만들때 항상 delete하는 코드도 같이 작성하시길 바랍니다. 까먹거든요...
MyClass mc;
이렇게 하면 객체 자체가 스택에 생성되지요, delete를 해줄필요가 없고 함수가 끝나면 없어집니다. 함수안에서 지역적으로 이용할때는 이렇게 스택에 잡아버리면 속편하지요.
--
Life is short. damn short...
heap에 할당 할때는 이렇게 하면 편하겠죠
:D heap을 쓸때는
STL의 smart pointer인 auto_ptr을 사용하면 편합니다.
코드:
std::auto_ptr<MyClass> mc(new MyClass);
이렇게 하면 mc의 life time이 끝날때 heap에 할당된 메모리가 자동으로 삭제되죠
자세한 것은 STL이 설명된 책을 보세요.
無心
stdauto_ptr 보다는 boostscoped_ptr이나 boosts
stdauto_ptr 보다는 boostscoped_ptr이나 boostshared_ptr을 추천합니다.
stdauto_ptr의 경우는 소유권 이전 시에 여러가지 모호한 상황이 발생할 수 있기 때문에 잘 모르고 사용하면 위험한 class라고 할 수 있구요
boost library의 boostscoped_ptr은 소유권 이전이 막혀져 있기 때문에 위험성이 적고 좀 더 가볍습니다.
boostshared_ptr은 이것보단 좀더 무겁지만 reference counting이 되는 smart pointer이기 때문에 heap에 할당된 객체들을 container에서 관리할 때 등의 다양한 상황에 적용할 수 있습니다.
또 release 시에 delete operator 말고 다른 function을 호출하도록 지정해 줄 수 있기 때문에 다음과 같은 경우에도 편리하게 사용가능합니다.
A *NewA();
void DeleteA(A *a);
라는 C api가 있을 때
boostshared_ptr<A> a(NewA(), DeleteA);
이렇게 하면 a 변수가 해당 scope이 벗어날때, 자동으로 DeleteA가 호출됩니다.
잘만 사용하면 Java의 GC가 부럽지 않죠 )
댓글 달기