C++ 指针 new delete

上概念:

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)

省的程序都完成了,怎么都找不到错误出在哪里。明明释放了内存,还说内存泄漏,或者其他内存错误。


C++ 指针 new delete

上一篇:迭代器模式----C++实现


下一篇:C语言中的加加减减