内存管理——new delete expression
C++申请释放内存的方法与详情表
调用情况
1.new expression
new表达式在申请内存过程中都发生了什么?
编译器将new这个分解为下面的主要3步代码,①首先调用operator new函数去申请内存,②然后再将指向内存的指针类型转换,③最后调用构造函数对这片内存进行初始化。
operator new函数不会抛出异常,它在申请内存时会循环调用malloc,如果申请不到内存,它会调用用户自己设定好的_canllnewh去清理内存,然后再次循环以保证可以申请到内存。
2.delete expression
我们知道,在C++中delete会调用析构函数,然后将内存释放掉,调用到最底层还是通过free来释放内存,delete可以直接调用析构函数。
这里用myString和标准库的string来测试一下是否可以直接调用构造和析构函数。
在myString的析构函数里加了一句打印,发现确实可以调用析构函数,string的对象应该也可以,但是它在析构过程中没有将指针置空,所以导致了它在析构以后仍然可以访问这段内存中的数据。
再试试构造函数是否可以直接调用
报错,显然不可以
不积小流无以成江河