zoukankan      html  css  js  c++  java
  • 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);                          释放内存

  • 相关阅读:
    H5调用相机和相册更换头像
    二分查找的递归解法以及希尔排序
    递归----经典问题:汉诺塔游戏
    递归----基础训练
    位运算-实现加减乘除
    位运算-出现k次与出现一次
    位运算-将整数的二进制进行奇偶位互换
    位运算-二进制中1的个数(三种解法)
    位运算-查找数组中唯一成对的数
    小小的总结一下2018年
  • 原文地址:https://www.cnblogs.com/sky-z/p/9507989.html
Copyright © 2011-2022 走看看