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

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

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

    • 栈Stack VS 堆heap
    • 堆对象的空间分析
    • 栈对象的空间分析
    • 变量模型与使用
    • 课程总结

栈(Stack) VS. 堆(heap)

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

堆对象的空间分析

栈对象的空间分析

变量模型与使用

  • 三种变量模型

    • 对象
    • 指针
    • 引用
MyClass c;  //对象 一定在栈上

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

MyClass& c2 = c;    //引用 要问自己是栈引用,还是堆引用

c = *pc;    //“解引用” 可指向堆对象,也可以指向栈对象

pc = &c;    //“取地址” 

堆引用

MyClass* pc2 = new MyClass();
MyClass& c3 = *pc2;
  • 三种使用场景

    • 声明对象
    • 传参
    • 返回值

三种传参方式

//对象
void func1(MyClass c) {
}
//指针
void func2(MyClass* pc) {
}
//引用
void func3(MyClass& mc) {
}

一个原则:谁分配谁释放

MyClass* pc = new MyClass();
func2(pc);
delete pc;

一个荒谬的做法,违反谁分配谁释放

void func3(MyClass& mc) {
    MyClass* p = &mc;
    delete p;
}

const引用是by value的替代品,const引用可以禁止引用修改原对象值

void func3(const MyClass& mc) {
}

三种传参方式,是否调用拷贝构造函数

MyClass c1;
func1(c1);  //调用拷贝构造
func2(&c1); //不调用拷贝构造函数
func3(c1);  //不调用拷贝构造函数

三种返回值方式分析

MyClass func1() {
    MyClass c1;
    return c1;
    //下面的方式会造成内存泄露,违反“谁创建,谁释放”。
    MyClass* pc2 = new MyClass();
    return *pc2;
}
MyClass* func2() {
    //函数返回后c1被销毁。
    MyClass c1;
    return &c1;
    //内存泄露
    MyClass* pc2 = new MyClass();
    return pc2;
}
MyClass& func3() {
    //函数返回后c1被销毁。
    MyClass c1;
    return c1;
    //内存泄露
    MyClass* pc2 = new MyClass();
    return *pc2;
}
MyClass& c4 = func3();
delete &c4;

传进函数的地址,可以再返回去。

MyClass& func4(MyClass& c) {
    return c;
}

一种编程语言能不能只有栈而没有堆?

不行,栈是静态的,编译时就确定。堆是动态的。

一种编程语言能不能只有堆而没有栈?

不行,没有栈就没有函数。

课程总结

  • 掌握内存模型分析方法——画运行时内存图
  • 掌握堆、栈概念
  • 掌握指针、引用、对象
  • 探微知著:魔鬼尽在细节中

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-19 15:05:00

极客班GeekBand - C++第一次课程辅导 - 李建忠的相关文章

极客班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

(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

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

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

极客Web前端开发资源大荟萃#007

本周我们带来的前端推荐包含当前热门的bootstrap,html5,css3等技术内容和新闻话题,如果你还想近一步学习如何开发,还可以关注我们的极客课程库,里面涵盖了现代开发技术的'学'与'习'的全新功能.希望对大家有所帮助!原文来自:极客标签 移动设备表单输入设计体验 - leader.js 为了帮助降低移动或者手机端输入的操作复杂度,leader.js提供了一个相对更简单的输入体验,你只需要输入表单内容回车即可完成输入,非常方便. Javascript游戏,街头霸王 有没有让你想起点什么?我

极客Web前端开发资源大荟萃

每周极客都将总结本周最精彩的素材提供给大家.希望能够带给你很多其它地灵感和帮助.极客#GB课程库#现已上线,不管你是0基础.中级.还是正在进修的高级前端project师.这里都将帮助你得到很多其它更高效的学习. #GB课程库# 极客Web前端开发资源大荟萃#001 怎样写出高性能的Jquery代码 讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议.来提升你的jQuery和javascript代码.好的代码会带来速度的提升.高速渲染

极客Web前端开发资源集锦

本周我们带来的前端推荐包含当前热门的bootstrap,html5,css3等技术内容和新闻话题,如果你还想近一步学习如何开发,还可以关注我们的极客课程库,里面涵盖了现代开发技术的'学'与'习'的全新功能.希望对大家有所帮助!原文来自:极客标签 移动设备表单输入设计体验 - leader.js 为了帮助降低移动或者手机端输入的操作复杂度,leader.js提供了一个相对更简单的输入体验,你只需要输入表单内容回车即可完成输入,非常方便. Javascript游戏,街头霸王 有没有让你想起点什么?我

李彦宏连续三年对话极客 都说了什么?

2015极客公园创新大会在北京举行,本次大会吸引了众多技术达人.极客一族的参与,值得一提的是,百度CEO李彦宏也做客极客公园,并同与会者分享了百度的技术信仰.实际上,这是李彦宏连续第三年参加该活动,这说明李彦宏非常愿意和技术极客们在一起交流和沟通,分享互联网行业的前沿技术.那么,李彦宏连续三年对话极客,都说了什么呢? 谈技术:百度的技术信仰 三年三次参与极客大会,李彦宏做了深入浅出的分享,这其中有很多相通的地方,比如对技术的信仰,李彦宏在三年的大会上都做了强调. 早在2013年,李彦宏就提出,真

# "做中学"之“极客时间”课程学习指导

目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时间课程介绍 Winter.程劭非.重学前端 宝玉.软件工程之美 蔡能.从0开始学游戏开发 陈旸.数据分析实战45讲 丁雪丰.玩转Spring全家桶 范学雷.代码精进之路 高磊.9小时搞定微信小程序开发 郝林.Go语言核心36讲 洪亮劼.AI技术内参 胡峰.程序员进阶攻略 胡忠想.从0开始学微服务 黄申.程序员