极客班直播课笔记1 C++对象内存模型(堆栈模型)

对象内存模型

一. 栈(Stack) VS. 堆(heap)

      • 由系统自动管理,以执行函数为单位
      • 空间大小编译时确定(参数+局部变量)
      • 函数执行时,系统自动分配一个stack
      • 函数执行结束时,系统立即自动回收stack
    • 堆 
      • 在c++中由程序员手动控制
      • 手动分配new和malloc
      • 手动释放delete和free
      • 具有全局性,总体无大小限制
      • 容易造成内存泄露

1. Myclass c(10); // 栈对象,空间大小在编译时确定,函数执行结束,系统立即回收

2.

Myclass* func(){
    Myclass c(10);
    return &c; //返回栈内存地址,指针悬浮,极端错误!
}

3.

Myclass func(){
    Myclass c(10);
    Aclass a(100);
    c.pa = &a;      //指向栈(local)对象,错!
    return c;
} 

结论: 指针指向栈对象,就要极度小心,一般会有问题!

4

Myclass* func(){
    Myclass *pa = new Myclass();
    return pa;   //小范围看没问题,但违背谁分配谁释放原则,此例接受者不知道要delete
}

总结返回指针问题:

返回栈指针: 完全错误

返回堆指针:释放可能有问题 ,易造成内存泄露

故一般不推荐

5 堆对象内存模型

6. 栈对象内存模型

二. 变量模型与使用 (对象,指针,引用; 声明,传参,返回值)

1. 声明与符号

“*” : 声明时,指针

用在指针前,解指针

“&”: 声明时,引用

用在对象前,取地址

MyClass c;  //对象,一定在栈上

MyClass* pc;    //指针,要问自己是栈指针,还是堆指针

MyClass& c2 = c;    //引用,要问自己是栈引用,还是堆引用。本例为栈引用                    // 举例堆引用 Myclass *pc2 = new Myclass();  Myclass& c3 = *pc2;  c3为堆引用
c = *pc;    //解指针, 可指向堆对象,也可以指向栈对象
                //pc指向哪里,*pc即为指向哪里的对象(堆/栈)
                //又c在栈上 再调用拷贝构造函数完成 c = *pc

pc = &c;    //取地址

2 传参分析

//对象
void func1(MyClass c) {    // 对象往往较大,开销大,一般不!
}
//指针
void func2(MyClass* pc) { // 成本ok,但无法区分堆/栈,有delete问题
}
//引用
void func3(MyClass& mc) { //推荐,不想双向传递用const
}

const& 为 pass by value好的替代品

void func3(const MyClass& mc) {
}

调用方法:

MyClass c1;
func1(c1);  //调用拷贝构造
func2(&c1); //不调用拷贝构造
func3(c1);  //不调用拷贝构造,注意参数就写值即可,参考笔记2,传递者无需知道接受者的接受方式。乱加符号可能变成取地址了

3. 返回值分析

返回对象分析:

MyClass func1() {
    MyClass c1;
    return c1;  //正确,调用拷贝构造
    MyClass* pc2 = new MyClass();
    return *pc2;  // 返回时调用拷贝构造,结束后pc2就取不到了,内存无法释放,一定存在内存泄露
}

返回指针分析:

MyClass* func2() {
    MyClass c1;
    return &c1;   //极端错误,返回栈对象指针
    MyClass* pc2 = new MyClass();
    return pc2;   //不推荐,可能内存泄露,违背谁调用谁释放原则
}

故返回指针一般不推荐

返回引用分析:

MyClass& func3() {
    MyClass c1;
    return c1;   //  极端错误,栈对象结束就消亡了
    MyClass* pc2 = new MyClass();
    return *pc2;  //可能存在内存泄露,有办法取到pc2,但一般人不会去做,也不知道要做
}

返回传入参数的引用,ok且推荐,常见还有this指针

MyClass& func4(MyClass& c) {
    return c;
}
时间: 2024-10-11 11:01:33

极客班直播课笔记1 C++对象内存模型(堆栈模型)的相关文章

七月算法--12月机器学习在线班-第一次课笔记—微积分与概率论

七月算法--12月机器学习在线班-第一次课笔记—微积分与概率论 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

极客班GeekBand - C++第一次课程辅导 - 李建忠

极客班GeekBand - C++第一次课程辅导 - 李建忠 极客班GeekBand - C第一次课程辅导 - 李建忠 栈Stack VS 堆heap 堆对象的空间分析 栈对象的空间分析 变量模型与使用 课程总结 栈(Stack) VS. 堆(heap) 栈 由系统自动管理,以执行函数为单位 空间大小编译时确定(参数+局部变量) 函数执行时,系统自动分配一个stack 函数执行结束时,系统立即自动回收stack 堆 在c++中由程序员手动控制 手动分配new和malloc 手动释放delete和

极客班GeekBand - C++面向对象高级开发 - 2

极客班GeekBand - C++面向对象高级开发 - 2 极客班GeekBand - C面向对象高级开发 - 2 讲师 - 侯捷 复习Complex类的实现过程 三大函数拷贝构造拷贝复制析构 栈堆与内存管理 Stack VS Heap stack objectsstatic local objectsglobal objects的生命期 heap objects的生命周期 new先分配memory再调用ctor delete先调用dtor在释放memory 动态分配所得内存块memory bl

极客班GeekBand - 互联网思维修炼 - 1

极客班GeekBand - 互联网思维修炼 - 1 极客班GeekBand - 互联网思维修炼 - 1 讲师 - 陈世欣 名人看法 第一部分 产品探索 痛点思维 天使用户 天使用户可以加快对产品的探索 天使用户的价值 如何找准天使用户 - 早期的用户应该来自窄小而尖锐的针尖 吸引天使用户的节奏-跃迁理论 天使用户获取容易留住难 社区运营中天使用户悖论 善待天使用户 细分定位 第二部分 商业模式 用户 VS 客户 用户思维 VS 客户思维 从用户还是客户赚钱案例EverNote 360 篱笆网 F

三月机器学习在线班第一课笔记--数学基础(1)

本课程的1-4节课都是复习机器学习相关的数学知识部分,这节课主要讲了微积分与概率论部分的数学知识. 本次笔记的PDF在七月算法论坛http://ask.julyedu.com/article/27?notification_id=14622&item_id=180 相应文章附件中供给大家下载,笔记中有错误的地方希望指出.下面是笔记的截图版,望轻拍~

<极客学院>视频教程学习笔记-iOS中CALayer的使用

<1>CALayer简介 1.CALayer一般作为UIView的容器而使用. 2.CALayer是一个管理者图片载体(image-based content)的层结构 3.直接修改单独创建出的CALayer的属性可以触发隐式动画 4.UIView中的CALayer动画必须显式触发才能生效 开篇代码练习: 1 #import "ViewController.h" 2 3 @interface ViewController () 4 //2单独创建一个layer 5 @pro

极客学院python学习笔记

基础 字符编码 字符:  字符是一个信息单位, 它是各种文字和符号的总称, 包括各国家文字, 标点符号, 图形符号,数字等 字符集: 字符集是字符的集合. 字符集的种类很多, 每个字符集包含的字符个数也不同. 常见的字符集有ASCII字符集, GB2312字符集, Unicode字符集等 字符编码:  是指对于字符集中的字符, 将其编码为特定的二进制数, 以便计算机处理. 常见的字符编码有ASCII编码, UTF-8编码, GBK编码 ASCII:  在 20 世纪 60 年代,美国制定了一套字

(GeekBand或极客班) inline 函数的思考。

候老师在课程中提到,在编写代码的时候尽量使用inline函数.想必inline函数在执行效率上应该是非常快的.那么到底有多少提升呢?下面就来测试一下. 首先,编写了两个函数,一个Add1(inline 函数),另一个Add2(非inline函数),代码如下: Demo.h #ifndef __DEMO_H__ #define __DEMO_H__ extern inline void Add1(unsigned long& total, unsigned long num) { num %= 1

极客与团队读书笔记

一.软件开发是团队合作,团队合作三支柱:谦虚,尊重和信任HRT 二.培养出色的团队文化 三.高效的团队需要一个领袖,如何做领袖,内容和方式 四.对付害群之马 五.操纵组织的艺术 1.向上管理,向领导上级沟通交流展示团队工作成果,进取性工作和防御性工作:进取性是指外部用户可以看到的效果明显的工作成果,防御性工作是底层基础维护和重构,防御性工作不应该超过三分之一 六,用户也是人 产品体验,易用性,速度,性能,营销