[Boolan]第二周学习笔记——rico风

来源:互联网 发布:淘宝五张宝贝主图规律 编辑:程序博客网 时间:2024/05/29 11:43
1.三大函数:拷贝构造、拷贝复制、析构

Class with point members:
String

拷贝构造函数,拷贝赋值函数

classString
{
public:                                
   String(constchar* cstr=0);          //默认构造函数                
   String(constString& str);           //拷贝构造函数(接受类的类型)            
   String&operator=(constString& str);//拷贝赋值函数(右边为类的类型)
   ~String();                           //析构函数         
  char* get_c_str()const{ return m_data; }
private:
  
char* m_data;
};

BigThree:拷贝构造函数,拷贝赋值函数,析构函数

两种字符串设计法:1.前面有字符串长度  2.后面有结束符’\0’(C/C++)

inline String::String(const char* cstr=0){
     if(cstr){
          m_data = new char[strlen(cstr)+1];
          strcpy(m_data,cstr);
     }
     else{
         m_data = new char[1];
         *m_data = ‘\0’; 
     }
}

inline
String::~String(){
     delete[] m_data;
}

class with pointer members 必须有copy ctor和copy op=

浅拷贝:按位复制
深拷贝:内存复制

拷贝构造函数:
inline
String::String(const String& str){
     m_data = new char[strlen(str.m_data)+1];
     strcpy(m_data,str.m_data);
}

拷贝赋值函数:
(自我赋值检查)
1.先删除之前空间
2.重新分配空间
3.复制数据

inline
String& String::operator=(const String& str){
     if(this==&str)          //赋值自我检测 e.g. a = a;
          return *this;
     delete[] m_data;
     m_data = new char[strlen(str.m_data)+1];
     strcpy(m_data,str.m_data);
     return *this;
}


2.堆、栈与内存管理
栈(Stack):是存在于某作用域(scope)的一块内存空间(Memory Space)。在调用函数时,会形成stack来放置其接收参数、返回地址。
函数内所有变量使用上述stack里的变量。

堆(Heap):或System Heap,是操作系统提供的一块global的内存空间,程序可动态分配(dynamic allocated)从其中获得若干区块(blocks)。

objects生命期:
stack object 生命期:离开作用域被自动清理,析构函数呗自动调用,又叫auto object。
static local objects 生命期:在作用域结束后仍然存在,直到整个程序结束。
global object 生命期:其生命在整个程序结束后才结束,也可以视为static object。
heap object生命期:生命在被delete时结束,对此类对象,需要注意内存泄漏(memory leak)。

new:先分配memory,再调用ctor。
1.分配内存
2.转型
3.构造函数

delete:先调用dtor,再释放memory。
1.析构函数
2.释放内存 -> 内部调用free(ps)

动态内存分配所得的内存块(memory space):

在给object分配对象时,会加上上下cookie表示分配空间大小。

array内部会有counter。

array new需要搭配array delete:
e.g.
String* p = new String[3];
...
delete[] p; //调用3次dtor
---------------
delete p; //调用1次dtor,另外两个对象空间不会被释放。
不带指针的类对象不受影响但是习惯不好。 
0 0
原创粉丝点击