内存管理——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的对象应该也可以,但是它在析构过程中没有将指针置空,所以导致了它在析构以后仍然可以访问这段内存中的数据。

再试试构造函数是否可以直接调用

 

 

 报错,显然不可以

 

 

 

 

posted @ 2019-12-16 11:22  C_hp  阅读(193)  评论(0编辑  收藏  举报