访问已删除的阵列访问冲突异常

时间:2013-05-05 15:29:01

标签: c++ access-violation

我想访问已删除的数组以查看内存是如何更改的,直到我删除了非常大的数组然后我得到access violation exception。请不要关心cout我知道他们很慢但我会摆脱它们。 当我为1000个元素阵列做它时,它是可以的,当我为1000000做它我得到一个例外。我知道这是一项奇怪的任务,但我的老师很顽固,我无法找到解决方法。

编辑:我知道我永远不应该访问那段记忆,但我也知道他当时可能会展示并告诉我说我不对。

    long max = 1000000;// for 10000 i do not get any exception.
    int* t = new int[max];
    cout<<max<<endl;
    uninitialized_fill_n(t, max, 1); 
    delete[] t;
    cout<<"deleted t"<<endl;
    int x;
    cin>>x;//wait little bit
    int one = 1;
    long counter = 0;
        for(long i = 0; i < max; i++){
            cout<<i<<endl;
            if(t[i] != 1){
                cout<<t[i]<<endl;
                counter++;          
            }               
        }

3 个答案:

答案 0 :(得分:2)

“删除”内存的状态未定义,删除后访问内存是UNDEFINED BEHAVIOR(意思是,当你访问这样的内存时,C ++规范允许“任何”发生 - 包括它有时“工作”的外观,以及“有时不工作”。

您永远不应该访问已删除的内存,并且如较大的数组中所示,它可能无法正常工作,因为您的进程可能无法再使用内存。

答案 1 :(得分:0)

您不能访问已发布的缓冲区

答案 2 :(得分:0)

访问不再使用的内存会导致未定义的行为。你不会得到任何一致的模式。如果原始内存在无效后未被覆盖,则这些值将与以前完全相同。

我发现this similar question的答案在用一个简单的类比来解释这个概念时非常明确。

模仿此行为的一种简单方法是创建一个返回指向局部变量的指针的函数,例如:

int *foo(){
 int a=1;
 return &a;
}