侯捷 贰—— 带指针的string

1,拷贝构造,拷贝赋值(copy op=)

2,如果对象中含有指针,赋值之后多个指针会指向同一个对象,谁来改,谁要用?形成别名的情形,比较危险。

3,字符串的长度统计实际:

   1)前面记录一个长度

   2)末尾以一个‘/0’作为结束符

4,带指针的类:拷贝过程一定要手动改写,保证每一个人有自己的空间,而不是共用一块空间。

5,检查自我赋值是必要的,可能会发生不确定的行为。

6,所谓的stack 和所谓的heap

   Complex c1(1,2);//函数所在的stack中,离开函数就会释放空间

   Complex *p=new Complex(8);//动态取得,有责任去手动delete掉

   Delete p;//默认调用析构函数

 

stack的生命周期:离开作用域scope就会被释放。

static对象,不受作用域影响,直到整个程序结束被释放。

全局对象,在所有的scopes之外,直到程序结束才被释放。

7,内存泄漏:找不到内存在哪里,也无法操作它

8, new------->

    1)调用melloc(n)分配空间得到void* mem;

2)将指针转型为具体类的指针pc=static_cast<Complex*>(mem);

3)调用构造函数Complex::Complex(pc,1,2);

9,delete---->

  1)调用析构函数(释放字符串在heap中的内容)

  2)释放内存(释放字符串本身那个指针的空间)

10,在VC中的复数分配过程:

    调试下;一个cookie是四个字节,中间有你要的你要的八个字节(两个double),也有其他的调试信息。--》8+(32+4)_debug+2*4cookie+padding(填补)--》十六的倍数-》64

    非调试下:(最小)两个cookie+8=16---》最后一位为1表示OS分出去了

    00000011------00000011(十六进制)

特别的:

对于string--》两个cookie+4=12---》十六倍数--》16(一次分配了16个字节)

11,array delete =: delete[] 多次调用析构函数,如果没有中括号便只有一次释放过程

 

 

发布了27 篇原创文章 · 获赞 1 · 访问量 1434

猜你喜欢

转载自blog.csdn.net/qq_34890856/article/details/88758505