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