다음 코드의 결과를 예측해보세요. ^^
#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;
}
어때요? 잘 작동하죠?^^