• [C++]new和delete


    Date:
    2014-1-5


    Summary:

    C++中的动态内存创建与释放(这里就只记录C++中的new和delete了,其他的C风格操作就略过了)

    单独记录new和delete的原因是为了学习时候关注点更清晰

    Contents:
    1.new操作符

    new操作符的作用是:找到一块长度正确的内存块,把该内存块的地址返回(所以我们需要一个指针用于接收new返回的内存地址,以便之后我们对该内存空间进行访问)

    2.delete操作符

    delete操作符的作用是:释放动new操作符创建出来的内存空间

    a).delete是释放内存,而不是释放指针

    b).delete不能用于释放那些通过声明获得的内存


    3.new[]与delete[]

    new[]用于动态创建数组,对应的使用delete[]来释放数组

    Notes:

    1.C++允许在一个函数中创建内存(new),在另外一个函数中释放它(delete)。即通过new创建的内存的生命周期直到对其调用delete时才结束.

    2.不要用delete来释放不是new分配的内存.

    3.不要用delete释放同一块内存两次.

    4.使用new[]分配的内存,要使用delete[]释放.

    5.对空指针进行delete是安全的.

    6.防止野指针导致程序错误.

    7.delete的释放对象是内存,而不是指针.

    EX:

       //
       //  main.cpp
       //  Cpp_All_Test
       //
       //  Created by StephenLee on 1/1/14.
       //  Copyright (c) 2014 StephenLee. All rights reserved.
       //
    
        // a).
        // 使用new操作符创建一块大小能容纳一个int的内存块,使用指针p接收new操作符返回的内存块地址
        int* p = new int(10);
        (*p) += 1;
        cout << "通过指针p访问动态创建的内存空间" << (*p) << endl;
        
        // 如果此时使p指向新的内存空间,那么之前创建的空间就无法被找到,它将一直存在于程序的整个生命周期中,这就造成内存泄露
        p = new int(20);
        cout << "忘了释放p所指向的内存,又把p指向新的内存,程序不会crash,但是造成了内存泄露:" << (*p) << endl;
        
        //使用完毕之后记得用delete释放new创建出的内存
        delete p;
        
        // b).
        // 不要过渡释放
        // delete p; //程序Crash,p指向的空间已经被释放过
        
        //此时p指向的内存已经被释放,但是p指针依然有值,它是一个野指针
        if(p)
        {
            // 程序会执行到此处
            // 我们通过delete告诉编译器,此块内存我已经用完了,还给你
            // 但是系统不一定立刻重新使用此块内存,所以此块内存的值还以为是存在,但是它绝对不是"安全"的
        }
        
        // c).
        // 所以通常在delete指针指向的空间之后,需要把指针设为空指针 , 防止野指针隐患
        // delete p;
        // p = NULL;
        
        // d).
        // delete可以被用于空指针
        p = NULL;
        delete p; // ok
        
        // e).
        // delete不能用来释放通过声明得到的内存
        int num = 30;
        p = #
        // delete p; //程序Crash , 不能释放非new创建的内存
        
        // f).
        // new[] 与 delete[]
        int* pArray = new int[10];
        for (int i = 0; i<10; i++)
            *(pArray+i) = i;
        
        for (int i=0; i<10; i++)
            cout << "pArray[" << i << "]=" << *(pArray+i) << endl;
        
        delete [] pArray;
        pArray = NULL;
    
        
    

      

    THE END

    人生就是一局不能Again的DOTA
  • 相关阅读:
    nyoj 19擅长排列的小明 (DFS)
    POJ 1321棋盘问题
    线段树与树状数组草稿
    组合博弈入门知识汇总
    组合博弈入门(题目练习及代码解析)
    pandas 连接数据库直接查表建立dataframe。loc,sort_values数据清洗操作
    Django 项目内利用ORM直接运行脚本读库
    Pandas库中的DataFrame
    利用pandas对numpy数组进行简单的科学计算
    进程池 爬去梨视频 视频资源
  • 原文地址:https://www.cnblogs.com/hellenism/p/3505950.html
Copyright © 2020-2023  润新知