class Person
{
public:
int mage;
char* name;
Person()
{
name = (char*)malloc(30);
memset(name, 0, 30);
strcpy(name, "defalut");
mage = 30;
}
void init()
{
name = (char*)malloc(30);
memset(name, 0, 30);
strcpy(name, "init");
mage = 30;
}
void clean()
{
if (name != NULL)
{
free(name);
name = NULL;
}
}
~Person()
{
if (name != NULL)
{
free(name);
name = NULL;
}
}
};
在C语言中,为了在运行时动态分配内存,C语言在它的标准库中提供了一些函数:malloc,calloc,realloc,释放内存的free,这些函数是有效的,但是它们是原始的,需要程序员理解,并且小心使用。为了使用C的动态内存分配函数在堆上创建一个类的实例,需要这样做:
void testc()
{
Person* person = (Person*)malloc(sizeof(Person));
person->init();
cout << person->name << ":" << person->mage << endl;
person->clean();
}
使用C语言在堆区分配内存,有几个缺点:1,必须确定对象的长度;2,malloc返回的是void*型的指针,需要转换;3,malloc申请内存可能会失败;4,用户在使用前,必须对在堆上开辟的对象进行初始化。
与C语言不同,C++中解决动态分配内存的方案是把创建一个对象所需要的操作都结合在一个new运算符里。当用new创建一个对象时,它就在堆里为对象分配内存,并调用构造函数完成初始化。new运算符能确定在调用构造函数初始化之前,内存分配是成功的。delete运算符先调用析构函数,然后释放内存。
void testcpp()
{
Person* person = new Person;
cout << person->name << ":" << person->mage << endl;
delete person;
}