"删除[]指针"不删除所有内存数组?

时间:2014-03-14 11:55:07

标签: c++ pointers memory-management new-operator

我对C ++很陌生。完成循环后,我必须删除指针和内存分配。我使用new()进行内存分配,最后使用delete来释放数据。

该计划如下:

int main()
{

    float *ptr;

    ptr = new float[16];

    for(int i=0; i<16; i++) 
    {
        ptr[i] = 10.0f+i;
        cout << i << " " << ptr[i] << endl;
    }

    delete[] ptr;

    cout << ptr[2] << endl;  **// I STILL HAVE THE VALUE AT THIS ADDRESS. AFTER DELETING**

    }

return 0;
}

为什么数据在删除后仍然存在于内存中。

1 个答案:

答案 0 :(得分:4)

这是未定义的行为。删除后,您正在访问内存。

因为删除内存块并不会将指向它的所有指针的值归零。删除内存只是说明内存可用于某些其他目的。在此之前,记忆可能看起来完好无损 - 但你不能指望它。在某些编译器/运行时/体系结构组合中,您的程序将表现不同。

调用delete[]时会发生两件事:

  1. 如果数组的类型具有非平凡的析构函数,则会以相反的顺序为数组中的每个元素调用析构函数
  2. 释放阵列占用的内存
  3. 在调用delete之后访问数组占用的内存会导致未定义的行为(即,可能发生任何事情 - 数据可能仍然存在,或者当您尝试读取时,程序可能会崩溃,或者可能会发生更糟糕的事情。)

    使用RAII。要么将它包装在一个类中,要么使用STL并且不要自己管理内存。 C ++是强大的,但你也可以把你的腿吹走 - 可以这么说。更好的做法是将其置于自己的范围内,以防止超出范围的任何内容访问指针。

    {
        Foo* pFoo = new Foo;
        // use pFoo
        delete pFoo;
    }
    // anything using pFoo beyond here fails at compilation