之前我们申请对象的时候都是用如下方式:
Person p1;
Person p2(...);
等等这样的。
这样申请的对象分配的地址是在内存的栈中。
那么我们如何在堆中申请空间来存储对象呢?
答案就是用 new操作符。
下面我们举例说明:
/****************************************************
* brief : new 操作符的使用
* author : shao
* date : 2020-02-29
* note : none
*
****************************************************/
#include <iostream>
using namespace std;
class Person{
public:
char *p_name;
int p_age;
//默认构造函数
Person() //这里属于深拷贝
{
//先分配内存
p_name = (char *)malloc(strlen("undefname")+1);
//把名字写进去
strcpy(p_name, "undefname");
p_age = 15;
cout << "Person 无参构造函数" << endl;
}
Person(char * name, int age) //这里属于深拷贝
{
//先给成员变量p_name分配内存
p_name = (char *)malloc(strlen(name) + 1);
//再把名字写入到p_name中
strcpy(p_name, name);
p_age = age;
cout << "Person 有参构造函数" << endl;
}
~Person()
{
cout << "Person 的析构函数" << endl;
}
void showInfo(void)
{
cout << "名字叫:" << p_name << ",年龄是:" << p_age << endl;
}
};
void test01(void)
{
//这种方式申请的内存分配在栈中
Person p1("老王", 18);
p1.showInfo();
/**
* 注:以下的申请内存在堆中,而申请的对象放到堆中时,
* 在调用结束后,不能自动释放内存。需要手动释放,
* 否则会造成内存泄漏。
* 手动释放的时候需要用delete,
* delete的具体过程是先调用析构函数把对象释放,
* 最后把指向该对象的指针指向NULL
*
*/
//这种方式申请的内存在堆中
Person* p2 = new Person(); //这个时候调用的是无参构造函数
p2->showInfo();
Person* p3 = new Person("老王", 19);
p3->showInfo();
delete p2;
delete p3;
}
int main(void)
{
test01();
return 0;
}
结果如下:
在结果中,显示我们的三个对象内存都释放了,也析构了。
其实code中也有说明,在栈中分配内存的对象,在函数调用结束时后,
会自动析构掉。
但是在堆中分配的内存必须要程序员手动释放,
也就是用操作符 delete xxx;来释放堆中的内存。
如果程序员忘记这个步骤,会造成内存泄漏,严重的会导致最后内存不足。