2009. 7. 22. 09:48

C++에서의 동적할당

C에서의 동적할당은 malloc같은 함수를 통해 하였다. 그렇다면 C++에서도 객체 포인터를 만든다음에 malloc을 통해 동적할당이 가능할까?

다음의 소스를 보자.

#include <iostream.h>
#include <malloc.h>

class TEST
{
  public:
    char a;

    TEST()
    {
      cout<<"디폴트 생성자"<<endl;
    }
    TEST(int j)
    {
      cout<<j<<endl;
    }
    void test()
    {
      cout<<"test"<<endl;
    }
    ~TEST()
    {
      cout<<"소멸자"<<endl;
    }
};

int main()
{
  TEST *B;
  
  B = (TEST*)malloc(sizeof(TEST));
  
  B->test();
  
  free(B);
  return 0;
}

컴파일도 이상없이 되고 test()함수도 호출된다.
하지만 자세히 보면 어떤 문제가 있는데, 그것은 생성자와 소멸자가 호출되지 않는다는 것이다. 이것은 프로그래머가 의도한 동작을 수행하지 못할 가능성이 생길 수 있다.

따라서 C++에서는 다음과 같은 동적할당 키워드를 제공한다.

  TEST *A;

  A = new TEST();
  
  A->test();
  
  delete A;

new 라는 키워드를 통해 동적할당을 하고, delete 키워드를 통해 free시킨다.

다음과 같은 코드도 가능하다.

  int *a = new int;
  
  *a = 1;

  cout<<*a<<endl;

  delete a;

따라서 C++에서는 malloc 보다는 new를 통해 동적할당을 하는 것이 바람직하다.

또한 다음과 같은 방법도 가능하다.

  int *a = new int[3];
  
  a[1= 5;  // 혹은 *(a+1)

  cout<<a[1]<<endl;

  delete []a;

다만 delete를 할때는 배열이란 것을 명시해줘야 한다. 하지 않는다면 하나만 지우게 된다.

'공부합시다 > C++' 카테고리의 다른 글

연산자 오버로딩  (0) 2009.08.05
임시 객체  (0) 2009.07.21
[펌] 함수 포인터 및 클래스 멤버함수의 함수포인터화  (0) 2009.07.21
함수 const  (0) 2009.07.21
인라인(inline) 함수  (0) 2009.07.21