C++网易云课堂开发工程师--堆,栈与内存管理

1.output函数

#include<iostream.h>

ostream& operator<< (ostream& os, const String& str){

  os << str.get_c_str();

  return os;

}

{

  String s1("hello");

  cout << s1;

}

2.Stack(栈),heap(堆)

{

  Complex c1(1,2);                               c1所占用的空间来自stack

  Complex* p = new Complex(3);                   complex(3)的空间来自于堆  

}

Stack,是存在于某作用域(scope)的一块内存空间(memory space).例如当调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。

在函数本省内声明任何变量,其所使用的内存均取自stack

Heap,是指由操作系统提供的一块global内存空间,程序可以动态分配(dynamic allocated)从某种获得若干区域(blocks)。

3.stack objects的声明期

class Complex{...}

{

  Complex c1(1,2);

}

c1便是所谓stack object,其生命在作用域(scope)结束之际结束生命,这种作用域内的object,又称为auto object,因为他会被自动清理(自动调用析构函数)。

4.static local objects的声明期

{

  static Complex c2(1,2);

}

c2便是所谓static object,其生命在作用域(scope)结束之后仍然存在,直至整个程序结束。

5.global objects的生命期

Complex c3(1, 2);

c3便是所谓global object,其生命在整个程序结束之后才结束。可以将其视为一种static object,其作用域是整个程序。

6.heap objects的生命期

class Complex{...}

{

  Complex* p = new Complex;

  delete p;

}

p所指的便是heap object,其生命在它被delete之际结束。

class Complex{...}

{

  Complex* p = new Complex;

}

以上出现内存泄漏(memory leak),因为当作用域结束,p所指的heap object仍然存在,但是指针p的生命却结束了,作用域之外再也看不到p(也就没有机会delete p).

7.new:先分配memory,在调用ctor

Complex* pc = new Complex(1,2);

编译器转化为

Complex *pc;

1.void* mem = operator(sizeof(Complex));      分配内存

2.pc =static_cast<Complex*>(mem);             转型

3.pc->Complex::Complex(1, 2);                 构造函数

8.delete:先调用析构函数,在释放内存

Complex*ps = new String("Hello");

delete ps;

编译器转化为

String::~String(ps);                          析构函数

operator delete(ps);                          释放内存

原文地址:https://www.cnblogs.com/sky-z/p/9507989.html

时间: 2024-10-01 04:41:29

C++网易云课堂开发工程师--堆,栈与内存管理的相关文章

C++网易云课堂开发工程师-头文件与类声明

区分Class的分类有两大经典,1包含指针的(complex),2不包含指针的(string). 1.complex 类分为:数据成员部分(在内存中占有数据成员的大小,数据可能会有很多份)与函数部分(只有一份). 2.string 类中:仅包含一个指针(这里理解为这一个指针指向,数据成员),创建出的每一个数据成员的大小实际上仅包含一个指针. 3.C++ programs代码基本形式 .h(header files) Classes Declaration(声明) .cpp() .h()标准库,引

C++网易云课堂开发工程师-操作符重载

1.操作符重载,(可以使用成员函数,也可以使用非成员函数) this 所有的成员函数均隐藏着一个参数,this. this与调用者相互绑定. complex c1,c2;                                                                                         对于两个复数的相加,暗含着左边加到右边. inline complex& complex::operator += (this, const compl

C++网易云课堂开发工程师--类模板

static complex data members static data members member functions static member functions 非静态成员函数:non-static member functions complex c1, c2, c3                                                                             complex c1, c2, c3 cout << c1

C++网易云课堂开发工程师--智能指针

template<class T> class shared_ptr{ public: T& operator*( ) const {return *px;} T* operator->( ) const {return px;} shared_ptr(T* p) : px(p) { } private: T* px; long* pn; } strcut Foo{ void method(void) { } }; shared_ptr<Foo> sp(new ) F

?《Python自动化测试修炼宝典》线上课程已经成功入驻网易云课堂......

<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课堂...... IT测试老兵利用工作之余,亲自录制的<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课堂,想要提高测试技术的小伙伴可以线上购买课程进行学习. 课程背景 测试人员进阶实战课程.本套课程以作者多年测试实战经验为背景,结合大量测试案例深入浅出讲解目前主流web端.app端自动化测试框架以及使用Python如何从0到1实现接口测试框架的搭建. 课程特色 系统教学+实战案例+开放源码.涵盖Python3

浪潮与网易云“互联网+”,用全栈一体机拿下私有云市场

关于本次传统企业数字化转型,核心要点是在云上完成数字化的产业升级,这是毕马威最新研究报告所指出的.毕马威认为,混合云通过建立传统IT与云环境之间的纽带,打破了IT上一代技术与未来云技术间的障碍.混合云为传统大型企业提供了一个全面连接数字化解决方案的平台,企业可以通过这个平台,自主选择未来业务的部署模式,以较小的代价.较低的风险来推进数字化转型之路. 目前以企业愿意接受的一体机形式交付的混合云,只有微软的AzureStack.自去年11月在中国市场发布以来,联想与华为都推出了AzureStack一

网易云课堂-软件工程(C编码实践篇)

网易云课堂-软件工程(C编程实践篇) 识别代码工程质量: 代码风格: 封装接口: 可重用代码: 可重入函数和线程安全: 代码风格的原则:简明.易读.无二义性:代码风格原则在团队交流过程中非常重要.

聊一聊【网易云课堂】

(首先说明,这不是广告,知识我个人的一点感受而已) 若干天之前注册了网易云课堂,并填写.邮寄申请讲师的材料. 若干天之后的今天,终于收到通知,我通过了讲师认证,给我名字上加了个大大的"V".以及<petshop4.0源码解读>教程通过了审核,正式发布了.下班之前看了看,竟然已经有6名学习者了,就是不知道他们有没有真的学.有想学的直接去那里看就行了,免费的. 课堂教程的网址是:http://study.163.com/course/introduction/655003.ht

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序 #ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #ifndef __cplusplus #error You must use C++ compiler, or you need filename with '.cpp' suffix #endif #include "ege.h" using namespace ege; #endif #inc