1. 程式人生 > >C++網易雲課堂開發工程師--堆,棧與內存管理

C++網易雲課堂開發工程師--堆,棧與內存管理

ret delete spa turn 內存空間 global alloc glob 工程

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); 釋放內存

C++網易雲課堂開發工程師--堆,棧與內存管理