본문 바로가기
Tip & Tech

malloc? free? new? delete?

by virgo81 2007. 9. 8.

다음 코드의 결과를 예측해보세요. ^^


#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

class MyClass
{
public:
    char* name;

    MyClass(void);
    ~MyClass(void);
};

MyClass::MyClass(void)
{
    cout<<"My Class is constructed."<<endl;
    name = (char*)malloc(sizeof(char) * 10);
}

MyClass::~MyClass(void)
{
    free(name);
    name = NULL;
    cout<<"My Class is destroyed."<<endl;
}

int main(void)
{
    MyClass* myClass = (MyClass*)malloc(sizeof(MyClass));
 
    strcpy(myClass->name, "virgo81");

    free(myClass);
    myClass = NULL;

    return 0;
}


.
.
.
.
.
.


C를 먼저 배우시고 C++을 배우신 분들이 쉽게할 수 있는 실수가 위 코드에 있어요.

위 코드의 실행결과는 애석하게도 볼 수 없어요.

왜냐하면 "런타임 오류"가 발생하기 때문이죠.

어느 코드에서 "런타임 오류"가 발생할까요?

범인은 바로! 코드 안에 있습니다.(썰렁;;;)

strcpy(myClass->name, "virgo81");

바로 이 라인에서 발생해요. 할당되지 않은 공간에 복사를 하려하기 때문이죠.

"엥? 생성자에서 분명히 할당하였는데 할당되지 않았다니!!! 거짓말 쟁이!" 라고 하시는 분이 계실거에요.

하지만, 위 코드에서 생성자와 소멸자는 불려지지 않습니다.

malloc 과 free는 생성자를 부르지 않고 단지, 메모리만 할당합니다.

따라서

name = (char*)malloc(sizeof(char) * 10);

위 라인이 실행되었을거 같지만, 실행되지 않았습니다.

그러면 어떻게 하면 좋을까요?

C++로 왔으면 new 와 delete 를 이용하세요.!

아래 코드는 수정된 코드입니다.



#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

class MyClass
{
public:
    char* name;

    MyClass(void);
    ~MyClass(void);
};

MyClass::MyClass(void)
{
    cout<<"My Class is constructed."<<endl;
    name = new char[10];
}

MyClass::~MyClass(void)
{
    delete [] name;
    name = NULL;
    cout<<"My Class is destroyed."<<endl;
}

int main(void)
{
    MyClass* myClass = new MyClass();
 
    strcpy(myClass->name, "virgo81");

    delete myClass;
    myClass = NULL;

    return 0;
}


어때요? 잘 작동하죠?^^