43对象的生存周期 in c++
就是讲内存和对象是怎样在栈上生存的
例子:想从一函数中得到一个数组
int *CreatArray()
{
int a[10]; //表面上对了,但是一旦函数一结束,指针a指向的内存空间就被系统释放了
return a;
}
int main()
{
int *b = CreatArray();//实际上这里b指向的内存空间是空的
return 0;
}
//❌❌❌❌❌❌❌❌❌错了
这就是理解对象如何在栈上生存的重要性
如果想要从函数中返回一段值
- 把数组不要放到栈上,而是放到堆上
- 把另外作用域上的数组以引用的形式或者指针的形式传入函数
int *CreatArray1()
{
int *a = new int[50]; //方法一
return a;
}
int *CreatArray2(int *c) //方法二
{
//填充数组的操作
}
int main()
{
int *b = CreatArray1();//实际上这里b指向的内存空间是空的
return 0;
}
但是如果我想把它放到堆上,但是想在作用域结束后把它自动释放了,可以吗
可以,用标准库中的**unique_ptr
**,它是一个作用域指针
作用域指针的原理
class ptr
{
Entity *a; //这个作用域指针是指向Entity类的
ptr(Entity *temp) : a(temp) {} //构造函数
~ptr() { //析构函数
delete a; //用完就删
}
}
💡这就是一个简单的作用域指针(作用域指针其实就是一个指针类罢了)
故在主函数中想把东西放到堆上但又不想再写一次delete
,就可以使用这个类
{
Entity *e = new Entity; //正常的放在堆上,超出作用域外还是存在
ptr e = new Entity(); //这个用了作用域指针类,一旦超出了作用域,就会调用析构函数删除掉指针!这样子就完成了放在堆上,但是作用域一结束就自动删除
}
这种一般也可称为栈变量(自动构造,自动析构,离开作用域后就自动销毁)
智能指针也大概是这样子