关于stack 和heap

栈:
由系统自动管理,以执行函数为单位
空间大小编译时确定
函数执行时,系统自动分配一个stack
函数执行结束时,系统立即自动回收stack。

在c++中由程序员手动控制
手动分配new和malloc
手动释放delete 和free
具有全局性,总体大象无限制
容易造成内存泄露
Myclass fun()
{
Myclass c(10);
AClass a(100);
c.pa=&a;
return c; //传参相当于拷贝
}

如果没有拷贝构造函数的语言拷贝时利用memory copy,按字节拷贝。

注意:不要用指针指向栈对象,不要用堆对象指向栈对象。

Myclass *func()
{
Myclass *pa=new MyClass();
return pa;//返回值尽量不要返回指针。
}
在函数外部调用后难道需要调用者手动释放吗?
Myclass *psfun();
delete ps ;
堆对象内存模型
栈上放指针 ,堆上放真正的对象

栈对象内存模型

在这里插入图片描述

变量模型与使用

三种变量模型
对象 Myclass c
指针 Myclass *pc c=*pc //解引用
引用 Myclass &c2=c //别名地址一样 pc=&c// 对c取地址
注意:分清栈对象还时堆对象
Myclass *pc2=new Myclass();//堆对象
Myclass&c3=*p2;//c3引用堆对象

三种使用场景
声明对象 void func1(Myclass c){} //传对象 Myclass c1;
void func2(Myclass *pc){}//传指针 func1(c1)//传对象
传参 func2(&c1)//传指针
func1(c1)//传引用
void func3(Myclass &mc)//传引用
返回值

注意:一般传参的时候不要传对象,也慎用传指针,推荐用引用 传参成本较低。

void fun3(Myclass &mc)
{
Myclass *p=&mc;
delete p; 如果这里是堆对象不应在fun3内释放,谁创建谁释放。
}

void fun3(const Myclass &mc)//const 引用不会被改变。
{
Myclass *p=&mc;
delete p;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值