1 栈内存对象
这种对象存储在栈内存,其生命周期是所在的花括号,例如在主函数中创建的对象,其生命周期就是主函数的花括号,即主函数执行完,此对象会自动被销毁。
栈内存对象的优势在于,无需手动回收销毁,当所在的代码块执行结束后,会自动被销毁,适合临时使用的对象。
// 手机类代码略
int main()
{
// 创建一个栈内存对象
MobilePhone mp1;
// 调用属性
mp1.brand = "小米";
mp1.model = "13";
mp1.weight = 200;
cout << mp1.brand << endl;
cout << mp1.model << endl;
cout << mp1.weight << endl;
// 调用函数
mp1.communicate();
mp1.play_music();
mp1.run_game();
return 0;
}
2 堆内存对象
这种对象存储在堆内存,需要使用关键字new来创建对象,使用关键字delete来手动销毁对象,如果不调用delete销毁对象,对象则会一直存在。
堆内存对象的优势在于,可以长期存在,并且通过手动的方式灵活销毁。需要注意的是,堆内存对象需要使用指针保存对象的存储地址,对象指针使用->来调用成员。
// 手机类代码略
int main()
{
// 创建一个堆内存对象
MobilePhone* mp2 = new MobilePhone;
mp2->brand = "苹果";
mp2->model = "14 Pro Max";
mp2->weight = 199;
cout << mp2->brand << endl;
cout << mp2->model << endl;
cout << mp2->weight << endl;
mp2->communicate();
mp2->play_music();
mp2->run_game();
// 堆内存对象使用完成后需要delete
delete mp2;
return 0;
}
如果堆内存对象不销毁,则会导致所占用的内存空间持续存在,当堆内存对象的指针所在的代码块执行结束后,此时程序不再有有效的指针变量管理堆内存对象,这块所占用的内存空间就再也无法回收了,这种现象被称为“内存泄漏”。在实际开发的过程中要避免内存泄漏的问题。
另外,有时候刚刚调用了delete的对象,还能继续使用部分功能,但是这样的做法非常危险,严禁使用。必要时,可在调用delete后直接赋值为NULL。