什么是new和delete?

  • new来分配内存
    在c语言中我们可以使用malloc来分配内存,在c++中依旧可以使用,但c++提供了一种更加高效的方法——new运算符。
    在c++中,我们为一个int类型的值分配内存,并且用指针来访问这个值。我们要告诉new,需要为哪种类型的数据分配内存,new找到一个长度正确的内存,并返回该空间的地址。

    int *p=new int

    new int告诉我们需要开辟一个int大小的内存,new根据类型来确定需要多少字节内存,然后找到内存,返回地址。接着把地址赋给p,p被声明为指向int的指针,现在p是地址,*p是存在内存中的值。

  • delete释放内存
    当需要内存时,可以使用new来请求,但使用new运算符时必须与delete匹配使用,使得在使用完内存后,将其归还,是通向有效使用内存的关键一步,归还或者释放内存以供其他部分使用,使用delete时需要与new分配的内存块匹配。

    int *ps=new int;//用new开辟一个int类型大小的空间返回地址给ps
    delete ps;//释放ps所指向的空间

    delete会释放ps所指向的空间但不会删除ps指针本身,例如可以将ps重新指向一个新的空间。new和delete一定要匹配使用,否则可能会发生内存泄漏问题,也就是说已经分配的内存无法再次使用。如果内存泄漏严重,程序将由于不断寻找内存而终止。
    不要尝试释放已经释放的内存块,c++标准指出,这样的结果无法预测,另外不能使用delete来释放声明变量所分配的内存。

    int *p=new int;
    delete p;
    int ps=5;
    int *pi=&ps;
    delete pi;

    delete只能释放new开辟的空间,但是对空指针使用delete是安全的
    注意,使用delete的关键在于,它用于new分配的内存。这并不意味着要使用new的指针,而是new的地址

    int *ps=new int;
    int *pq=ps;
    delete pq;

    一般来说不会创建两个同时指向同一块内存的指针,因为这将增加错误的删除同一个内存块两次的可能,但对于返回指针的函数,使用另一个指针确实有道理。

  • new开辟动态数组
    c++中创建动态数组很容易,只要将数组的元素数目和元素类型告诉new,在类型后面加上方括号[ ],其中包含元素个数,例如:

    int *p=new int[10];//创建一个元素数目为10的数组;

    new返回第一个元素的地址。该地址被赋给指针p。
    当程序使用完new后应该用delete来释放他。但是对于new开辟的数组,应该使用另一种格式来释放:delete [ ] p;
    方括号告诉我们,应该释放整个数组而不仅仅是指针指向的元素。new和delete之间应该匹配使用,new匹配delete,new[ ] 匹配delete [ ]。
    总之,使用new和delete时遵守以下规则:
    1.不要使用delete来释放不是new开辟的内存。
    2.不要使用delete多次释放同一个内存块。
    3.如果用new[ ]为数组分配内存,则应该使用delete [ ] 来释放内存。
    4.对空指针delete是正确的

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/81625895