1.output函數ios
#include<iostream.h>函數
ostream& operator<< (ostream& os, const String& str){spa
os << str.get_c_str();
操作系統return os;
指針}內存
{作用域
String s1("hello");
getcout << s1;
編譯器}io
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); 釋放內存