首页 > 代码库 > 指针杂谈 && 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,特别是隐式内存泄露,难以监测,危害无穷。