C++ 中的 delete[] 机制剖析

本文简单总结了delete[]放在析构函数中VS放在主函数中的区别(针对自己定义类)。

    我们编译出来的程序运行时是和操作系统打交道的,程序中用到的内存都向操作系统申请,在多任务的操作系统下,不允许普通的程序访问未分配的内存。操作系统手里有一张表,标明内存中的哪些单元被哪个程序占用了,哪些是空闲的(空闲不一定是空值,我们编写的程序如果动态变量没有初始化往往会带有不定值,就是这个缘故),当程序提出申请,它就把空闲的内存分配给程序。程序运行完后操作系统再把分配给的内存标记为空闲,以供其他程序用。我个人的猜测,执行delete只是将它后面变量的地址告诉给操作系统,操作系统把它手里的那张表给改了,但delete掉的指针没有变化,还是原来指向的变量的地址值(可以做个小实验,new出来的delete后指针不会变,但所指向的内存所存放的变量可能就变了;但如果定义另外一个指针,再将另外那个指针赋给当前指针,则delete后,所指向的内存所存放的变量仍然是不变的,因为只是指针的赋值,本质上还是两个指针)。

测试程序:

#include <iostream>

int main()
{
    int *p;
    int pp=9;
//    p=&pp;         //delete p后,指针所指向的内存还是pp的,pp并没有释放,还是9
    p=new int(5);    //delete p后,就是p所指向的内存被标记为空闲了,数据不确定
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//1
    delete p;
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//2

    return 0;
}
  • delete[] 放在主函数中时,是用来释放对象,执行这条语句会跳到析构函数中(这就是所谓的"在撤销对象占有的内存之前完成一些清理工作”,析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会)。如果有多个对象则用delete[] ,单个对象的话直接delete。
  • 跳到析构函数中后,如果析构函数中有delete[] 语句,则释放这个对象(即this指针指向的当前对象)所拥有的指针成员变量所占用的空间(请注意:成员变量是指针类型时才需要delete,普通的不用(其实也不能,会报错的啦)),同理,有多个指针成员变量则用delete[] ,只有一个的话则delete即可。
『注:本文来自博客园“小溪的博客”,若非声明均为原创内容,请勿用于商业用途,转载请注明出处http://www.cnblogs.com/xiaoxi666/』
原文地址:https://www.cnblogs.com/xiaoxi666/p/6423602.html