带指针的类(eg. string.h)
只要类带指针一定要自己写拷贝构造函数和拷贝复制函数。
拷贝构造,拷贝赋值,析构
拷贝构造函数:
string s1();
string s2("hello");
string s3(s1);//拷贝构造
cout<<s3;
拷贝幅值函数:
如果没有检测自我赋值可能会导致结果出错,不仅仅只是效率高低的问题(因为赋值的第一件事是将待赋值指针delete)。
s3 = s2;//拷贝赋值
cout<<s3;
如果做了动态分配,那么结束之前需要调用析构函数释放内存,否则可能会导致内存泄露。
堆、栈与内存管理
栈是存在某作用域的一块内存空间,调用函数,函数本身会形成一个stack用来放置所接受的参数,返回地址,区域对象。
其生命在作用于结束之后结束,会被自动清理。
静态对象生命会知道整个程序结束。
全局对象的作用域也是整个程序。
堆是由操作系统提供的全局内存空间。
需要delete,因为当作用于结束后,对象仍然存在,会产生内存泄露(没机会delete)。
new : 先分配内存(malloc)在调用拷贝构造。
delete : 先调用析构函数,再释放内存(free)。
new char[] 需要搭配 delete[],否则会因为未调用足够次数的析构函数导致内存泄露。