代码改变世界

[C++]new和delete

2014-01-05 15:47  hellenism  阅读(307)  评论(0编辑  收藏  举报

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