首页 > 代码库 > 指针杂谈 && memory leak
指针杂谈 && memory leak
1、声明一个指针
int *pcount; //一个指向int variable的指针,命名为pcount
int count = 5;
pcount = &count;//&是取地址符, *pcount=&count是错的
cout << count; //5
cout << pcount; //输出count存储的内存地址
cout << &count; //输出count存储的内存地址
cout << *pcount; //5
Note:
①我们可以把int* 看成一种data type,那么pcount指的就是指针本身,储存的variable是内存地址;而*pcount指的是地址为pcount的内存里面的具体内容。
②int*表示的是指针指向一个int型,数据是什么类型,指针也要保持一致,以下是错的:
eg:double area = 3.14;
int *parea = &area; //wrong
double *area = &area; //correct
2、传递指针函数参数pass-by-reference with pointers
void swap(int *pvalue1, int *pvalue2)
{
int temp = *pvalue1;
*pvalue1=*pvalue2;
*pvalue2=temp;
}
int main()
{
int num1 = 1;
int num2 = 2;
swap(&num1, &num2); //after swapping, num1 = 2, num2 = 1;
}
Note:通过改变指针pvalue1和pvalue2的内容来交换两个数值
3.数列&&指针
数列本身是address_based;list指的是首元素的地址,以后每个元素的地址以加1递增;
int list[8]={1,2,3,4,5,6,7,8};
int *plist = list;//这句话等同于int *plist = &list[0]
第一个element的地址是list或者&list[0]或者plist;接下来第二个元素是list+1或者&list[1]或者plist+1;接下来第三个元素是list+2或者&list[2]或者plist+2......
4、常量指针和指针常量
常量指针:指针不能改变,即地址不能改变,但是该地址存储的内容可以改变
指针常量:指针的内容不能改变,但是用来存储它的地址可以改变
const int *pvalue = http://www.mamicode.com/&value;//指针常量,*pvalue是常量,但是pvalue可以改变
int *const pvalue = http://www.mamicode.com/&value; //常量指针, pvalue是常量,但是*pvalue可以改变
5.返回指针
我们知道我们无法返回一个数组,只能传递一个数组;但是我们可以返回指针,问题在于,在function里声明的指针是local的,返回后立刻清栈,所以我们必须在heap里面分配指针空间,这样返回时就能传递到main函数里面。
①声明:用new动态分配数组空间
int *reverseArray(const int *list[], int size)
{
int *resutArray = new int[size]; //可以用resultArray[0]来访问新数列
/*** main function body***/
return resultArray;
}
NOTE:如果是单一变量,可以这样声明:
double *test = new double;//分配一个内存空间给double型变量*test,然后将这个内存地址赋值给test
②释放空间
用new动态分配的内存,必须用delete删掉,否则很容易造成内存泄露。
int *pvalue = http://www.mamicode.com/new int;//假设动态分配地址1005给pvalue
*pvalue = http://www.mamicode.com/45;
pvalue = http://www.mamicode.com/new int;
这样子,忘记释放原来pvalue的内存空间就立刻给他分配一个新的,as a result,因为没有其他的指针指向地址1005,这个内存不可能再被访问和修改,这样子就造成了memory leak!!
所以我们必须使用以下语句:
delete [] resultArray;
或者
delete pvalue;
③关于memory leak
what?必须从操作系统的角度进行解释,操作系统给所有进程分配的空间正在被某个进程榨干,由程序申请的一块内存,如果没有一个指针指向它,那么这块内存就泄露了,他不可能再被访问和修改;
consequence?如果该代码是一次性(executed once),那么危害性是不大的;如果该代码是偶发性(executed randomly),常发性(executed frequently)甚至隐式(executed implicitly)的,那么每次执行就会造成一块内存泄露,这样子最终所有的内存将会被占用,最终导致系统奔溃crash,特别是隐式内存泄露,难以监测,危害无穷。