C++ 指针 增减运算问题

来源:百度知道 编辑:UC知道 时间:2024/07/08 19:26:45
int *aptr;
aptr=new int[5];
for(int j=0;j<5;j++) aptr[j]=j;
for(int i=0;i<5;i++)
{
cout<<*(aptr+i);
}
delete [] aptr;
return 0;

以上是代码运行正常,可是我换成这句就不对了,cout<<*(aptr++); 编译没问题,调试出问题,麻烦高手指教下

aptr++会改变aptr本身的值,你进行了5次aptr++操作之后aptr所指的位置已经不是当初动态分配的数组的位置了,很有可能移到了静态分配的区域。这时候如果要用delete的话回收的不是当初分配的空间,而是别的地方。这种是运行错误,编译器是无法判断的,但运行起来肯定有问题。

aptr++改变aptr的值,aptr++,循环结束后aptr所指的位置在当初动态分配的数组外。delete回收的不是当初分配的空间。这种是运行错误,编译器是无法判断

还要补充一下,一般delete了,还应该将aptr=NULL,这是编程的好习惯...
你非要写成aptr++,那在循环前定义一个指针,p=aptr,delete []p..

aptr+i没有改变指针aptr的值,
但是aptr++会改变指针aptr的值,
最后回收内存时delete [] aptr;
就会收到相反的效果

这个主要跟delete [] aptr;语句有关;
你用cout<<*(aptr++); 的话其实也可以的,但由于aptr一直++,到最后指针aptr指向的地址是数组的最后一个元素的地址,而调用delete [] aptr;释放的时候是从数组的第一个元素的地址开始的,这样当然出问题了。
解决办法:你可以在掉用delete [] aptr;函数之前从新让aptr指向数组的首地址;或者干脆把delete [] aptr;注释起来不用。