class 기초질문

zini08의 이미지

갑자기 생각나서 질문드립니다

MyClass라는 class가 있다고 가정을 한다면

MyClass *mc = new MyClass;

라고 하는것과

MyClass mc;

해서 쓰는것들이 어떤 차이를 가지는 지요??

aero의 이미지

MyClass *mc = new MyClass;

는 mc 라는 포인터에 MyClass의 메모리를 동적으로 할당 하는것입니다.
나중에 꼭 할당한 메모리를 클래스 사용이 끝나면
delete mc;
이렇게 수동으로 해제 해줘야합니다. 안그러면 프로그램이 돌아가는중에
필요없는 메모리를 계속잡고 있게되어 시스템의 사용가능한 메모리가
줄어들게 되겠죠.

MyClass mc;

이건 컴파일타임시에 클래스의 영역이 정적으로 할당되며
프로그램이 종료하면 자동으로 사라집니다.

큰 프로그램을 짤때 많은 데이터들이 메모리에 할당되고 해제되야되는데
후자의 방식을 쓰면 쓸데없이 많은 메모리를 프로그램 종료시까지
소비하게 되므로 전자처럼 필요할때 메모리를 동적으로 할당받고
필요없어지면 해제하는 방식으로 프로그래밍하게 되는거죠

kall의 이미지

MyClass *mc = new MyClass; 는 힙에 잡히고

MyClass mc; 는 스택에 잡힌다고 알고 있습니다.

고로 new로 잡은넘은 적절한때에 delete를 해줘야 겠지요.

맞는지 모르겠군요 -_-;

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

jj의 이미지

MyClass *mc = new MyClass;

라고하면, mc라는 포인터변수는 stack에 할당됩니다. 당연히 mc라는 포인터는 함수가 종료하면 사라집니다. 반면에 이 포인터가 가리키는 실제 객체는 Heap에 생성되어서, 명시적으로 "delete" 해주거나 프로그램이 종료할때까지 메모리에 존재합니다.

포인터가 스택에 있기때문에, 함수가 종료하기 전에 "delete mc" 로 객체를 제거해야합니다. 혹은 함수가 종료하기 전에 "anotherPointer = mc" 같이 해서 class의 멤버나 전역변수에 포인터값을 복사한다면, 함수가 종료한 후에도 객체를 제거할 수 있겠죠.

new를 통해 객체를 만들때 항상 delete하는 코드도 같이 작성하시길 바랍니다. 까먹거든요...


MyClass mc;

이렇게 하면 객체 자체가 스택에 생성되지요, delete를 해줄필요가 없고 함수가 끝나면 없어집니다. 함수안에서 지역적으로 이용할때는 이렇게 스택에 잡아버리면 속편하지요.

--
Life is short. damn short...

sandro의 이미지

:D heap을 쓸때는

STL의 smart pointer인 auto_ptr을 사용하면 편합니다.

코드:
std::auto_ptr<MyClass> mc(new MyClass);

이렇게 하면 mc의 life time이 끝날때 heap에 할당된 메모리가 자동으로 삭제되죠

자세한 것은 STL이 설명된 책을 보세요.

無心

clhitter의 이미지

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가 부럽지 않죠 )

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.