C++二维数组输入输出代码报munmap_chunk无效指针错误原因求解
报错原因分析
munmap_chunk(): invalid pointer 报错的核心原因是你传递给delete[]的指针不是new[]返回的原始内存地址。
你在输出数组的嵌套循环中,持续执行p = p + 1修改了指针p本身的存储值:
for( i=0;i<r;i++){ for( j=0;j<c;j++){ cout<<*p<<" "; p=p+1; // 这里不断修改原始指针的指向 } cout<<endl; }
遍历完成后,p已经指向了数组最后一个元素之后的非法地址,此时执行delete[] p,内存管理器无法识别这个非堆块起始地址的指针,就触发了内存释放错误。
修复方案
有两种常用的修复方式:
- 方式一:输出时保持原始指针不变,用偏移量访问元素,和你输入数组时的写法保持一致即可:
cout<<"\nThe array elements are:"<<endl; for( i=0;i<r;i++){ for( j=0;j<c;j++){ cout<<*(p + i*c +j)<<" "; } cout<<endl; }
- 方式二:额外声明临时指针用于遍历,原始指针保留初始地址用于释放:
cout<<"\nThe array elements are:"<<endl; int *tmp = p; for( i=0;i<r;i++){ for( j=0;j<c;j++){ cout<<*tmp<<" "; tmp = tmp +1; } cout<<endl; }
两种方式都可以保证最后delete[] p时传入的是new[]返回的原始地址,不会触发内存释放错误。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

