天天看点

侯捷c++课程 string类 笔记

class with pointer members

由于字符串的长度是不确度的,所以使用数组来存放字符串,不好确定数组大小

因此选择使用char* 动态分配内存的方式来存储

字符串string类的数据成员只有一个char* 指针,通过动态分配内存指向字符串

带有指针的类有三个特殊函数 析构函数 复制构造函数 operator =

不能使用编译器自动生成的operator =和复制构造函数,这些函数是直接的bit by bit 的指针赋值

会造成内存泄漏,即内容还在那里,没有被回收,但没有指针指向这里

同时会形成两个指针指向同一块内存区域,当一个指针delete后,另外一个也会受影响(alias)

首先获取参数的字符长度,由于strlen返回的长度不包括结尾的'\0',所以要分配的内存空间要strlen(cstr)+1

在常规的构造函数中,即使指针参数为空指针,也要分配一个char的内存空间,内容为'\0'

调用strcpy复制,自动复制结尾的'\0'

当string类的实例对象的作用域结束后,os会收回其所占用的内存空间

但string类的数据只有一个指针,这个指针所指向的内容是不会自动回收的,所以要在析构函数中手动delete

实现和复制构造函数类似,但是要先清空自身内容,再进行赋值

要判定自我赋值的情况,如果不判断,将直接清空自身的内容,指针成为野指针,会发生undefined behavior

在函数function body内声明的变量,内存来自于stack

heap是os提供的一块global内存空间,可通过new进行动态分配内存

stack object在作用域结束后被自动清理 而heap object仍然存在

在变量声明前加static关键字,即为static object,其在作用域结束后仍然存在,直到整个程序结束

global object也可看作一种static object,作用域是整个程序

new被编译器转化为三个步骤:

1.调用malloc分配内存

2.static_cast类型转换

3.调用构造函数

delete为两个步骤:

1.调用析构函数

2.调用free释放内存

delete 和 delete[] 都会将其所指的内存块全部释放

区别在于delete[]会对数组内的每一个元素调用析构函数 而delete只对第一个元素调用

如果数组元素为带有指针成员的类,使用delete会造成memory leak