C++使用指针引用作为参数出现读取访问违例如何解决?
问题解答
异常触发原因
- 调试操作触发:你在
test函数内执行delete[] tmp2后,tmp2指向的原长度为1的int数组已经被释放,若调试过程中你主动查看这段已释放内存的地址内容,调试器就会抛出读访问违例异常,这属于调试操作触发的异常,不是代码运行逻辑本身的错误。 - 堆检查触发:你的代码存在明确的内存泄漏,
test函数为ptr重新分配了长度为2的int数组后,main函数使用完该数组没有执行delete[] ptr释放内存,开启了严格堆检查、内存消毒器(ASAN)等工具的调试环境会在程序退出时抛出相关异常。
异常规避方案
- 调试过程中不要主动查看已经通过
delete/delete[]释放的内存地址的内容。 - 在
main函数返回前补充delete[] ptr;逻辑,释放test函数内分配的堆内存,消除内存泄漏问题。 - 建议在输出语句末尾增加换行符
\n或者endl,既可以让输出格式符合预期,也能刷新输出缓冲区避免内容粘连。
不使用指针引用实现内存重分配的方法
如果不使用指针引用类型,要修改函数外部指针变量的指向,需要传入*二级指针(指针的指针)*作为参数,本质是把外部指针变量的内存地址传入函数,在函数内部通过解引用的方式修改外部指针的取值。
修改后的参考代码如下:
#include<iostream> using namespace std; void test(int** ptr); int main(void) { int* ptr = new int[1]; ptr[0] = 100; cout << ptr[0] << '\n'; test(&ptr); cout << ptr[0] << '\t' << ptr[1] << '\n'; // 释放堆内存 delete[] ptr; return 0; } void test(int** ptr) { int* tmp = new int[2]; tmp[0] = 1; tmp[1] = 2; int* tmp2 = *ptr; *ptr = tmp; cout << (*ptr)[0] << '\t' << (*ptr)[1] << '\n'; delete[] tmp2; }
内容的提问来源于stack exchange,提问作者PangDae
相关产品推荐
相关产品推荐

