上概念:
1) C++中指针亦是一个变量,他指向一个内存地址,如果一定要说它是个类型的话, 它和整数unsigned int类型一样,是4字节(32bit-system)变量。比如:
int *a= (int*)12300;
a变量里的存放的就是12300,它代表的意思是:指向内存地址为12300的内存块,这个内存块存放的是int型变量。
a本身也存放在内存中,a的地址为另外一个数字,在console下可以用cout<<&a<<endl;输出看看。
2)使用new,一旦分配成功,即将指针初始化,那么该指针就可以当作数组来用了。
如下:
int * a=new int[2];
我们甚至可以用 a[1000]=12;来设定内存的值。
这样做是合法的,但却是不安全的。
这会引起内存泄漏。我们使用 delete a时, 只释放了a[0] a[1], 而 2~1000都还没释放。
int *a=new int[2];
a[1000]=120;
a[0]=0;
a[1]=1;
delete a;
cout<<a[1]<<endl;
cout<<a[1000]<<endl;
运行上述代码,发现a[1]变成随机数,而a[1000]仍然为120。其仍然收本程序保护和管理。其他程序无法修改。
1000比较小,所以不会引起太大的错误。如果说是10000000甚至更大,使用a[10000000]就会出错了。
这是因为可用内存不是连续的,而是东一块西一块。
你说你要空间为2的房间。我就给你找了个大于2的,比如4。
你却变大到1000了,那肯定插到其他房间去了,其他房间要没人还好(仍然为闲散内存)。如果有人占据了(有程序再用),就会导致访问内存出错。
这时候必须要用int * a =new int[10000000]来初始化。
【总结】
1)使用指针访问内存,只需要保证:指针指向的内存可访问。 (问:为啥int*a;这么一定义,然后直接用a[0]会出错? 相信你能想通)
2)保持良好的代码习惯,不要越界访问,即你定义了 int*a=new int[n];那么就不要访问 a[n]和a[n]以上的内存。 另外,delete指针之后给指针赋值NULL。
3)为啥我们说delete 完指针后最好用NULL再赋值一下?
因为,程序员也是人,难免会犯错。所以用 a=NULL 赋值一下。那么下次你再调用a访问内存,直接会报错。
(Access of the address 0x00000000)
省的程序都完成了,怎么都找不到错误出在哪里。明明释放了内存,还说内存泄漏,或者其他内存错误。