You need to enable JavaScript to run this app. C++使用指针引用作为参数出现读取访问违例如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 05:15:04