0

我想访问已删除的数组以查看内存是如何更改的,直到我删除了非常大的数组然后我得到了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++;          
            }               
        }
4

3 回答 3

2

“已删除”内存的状态是未定义的,删除后访问内存是未定义行为(意思是,C++ 规范允许在您访问此类内存时发生“任何事情” - 包括它有时“工作”和“不工作”的外观“ 有时)。

您不应该访问已删除的内存,并且如您的较大数组案例所示,这样做可能不起作用,因为内存实际上可能不再可用于您的进程。

于 2013-05-05T15:35:10.360 回答
0

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

我发现这个类似问题的答案在用一个简单的类比来解释这个概念时非常清楚。

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

int *foo(){
 int a=1;
 return &a;
}
于 2013-05-05T15:38:37.090 回答
0

您无权访问已释放的缓冲区

于 2013-05-05T15:34:39.453 回答