栈:
由系统自动管理,以执行函数为单位
空间大小编译时确定
函数执行时,系统自动分配一个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;
}