"delete [] pointer"不删除所有内存阵列?

"delete [] pointer" does not delete all the memory array?

本文关键字:内存 阵列 delete pointer 删除      更新时间:2023-10-16

我对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;
}

为什么数据删除后还存在于内存中

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

因为删除内存块不会使指向该内存块的所有指针的值归零。删除内存只是记录了该内存可用于其他目的。在这种情况发生之前,记忆可能看起来是完整的——但你不能指望它。在一些编译器/运行时/体系结构组合中,你的程序会表现得不同。

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

  1. 如果数组的类型具有非平凡析构函数,则按相反顺序对数组中的每个元素调用析构函数
  2. 数组占用的内存被释放

调用delete后访问数组占用的内存会导致未定义的行为(也就是说,任何事情都可能发生——数据可能仍然在那里,或者当您尝试读取它时程序可能崩溃,或者其他更糟糕的事情可能发生)。

RAII使用。要么把它包装在一个类中,要么使用STL,不要自己管理内存。c++是强大的,但也可以这么说,你也可以把你的腿打飞。一个更好的做法是把它放在自己的作用域中,这样可以防止作用域之外的任何东西访问你的指针。

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