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); 释放内存