&引用;删除[]指针";是否不删除所有内存阵列? 我对C++很陌生。一旦完成循环,我必须删除指针和内存分配。我正在使用new()分配内存,并在最后使用delete释放数据

&引用;删除[]指针";是否不删除所有内存阵列? 我对C++很陌生。一旦完成循环,我必须删除指针和内存分配。我正在使用new()分配内存,并在最后使用delete释放数据,c++,pointers,memory-management,new-operator,C++,Pointers,Memory Management,New Operator,计划如下: 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] <

计划如下:

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;
}
intmain()
{
浮动*ptr;
ptr=新浮点数[16];

对于(int i=0;i这是未定义的行为。您在删除内存后正在访问它

因为删除内存块并不会使指向它的所有指针的值为零。删除内存只是说明内存可用于其他用途。在这种情况发生之前,内存可能看起来是完整的,但您不能指望它。在某些编译器/运行时/体系结构组合中,您的格拉姆的表现将有所不同

调用
delete[]
时会发生两种情况:

  • 如果数组属于具有非平凡析构函数的类型,则将按相反顺序为数组中的每个元素调用析构函数
  • 阵列占用的内存被释放
  • 调用
    delete
    后访问数组占用的内存会导致未定义的行为(也就是说,任何情况都可能发生——数据可能仍然存在,或者您的程序在尝试读取数据时可能会崩溃,或者可能会发生更糟的事)

    使用。要么把它打包在一个类中,要么使用STL,不要自己管理内存。C++是强大的,但是你也可以把你的腿吹走——可以说。更好的做法是把它放在它自己的范围内,防止超出范围的任何东西从你的指针访问。

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

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

    因为删除内存块并不会使指向它的所有指针的值为零。删除内存只是说明内存可用于其他用途。在这种情况发生之前,内存可能看起来是完整的,但您不能指望它。在某些编译器/运行时/体系结构组合中,您的格拉姆的表现将有所不同

    调用
    delete[]
    时会发生两种情况:

  • 如果数组属于具有非平凡析构函数的类型,则将按相反顺序为数组中的每个元素调用析构函数
  • 阵列占用的内存被释放
  • 调用
    delete
    后访问数组占用的内存会导致未定义的行为(也就是说,任何情况都可能发生——数据可能仍然存在,或者您的程序在尝试读取数据时可能会崩溃,或者可能会发生更糟的事)

    使用。要么把它打包在一个类中,要么使用STL,不要自己管理内存。C++是强大的,但是你也可以把你的腿吹走——可以说。更好的做法是把它放在它自己的范围内,防止超出范围的任何东西从你的指针访问。

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

    这些都是垃圾值。删除后内存“不再属于您”,但没有人说在释放内存时必须将其清除。此外,这可能是一个分段错误,您的编译器可能会忽略“delete[]”行,因为程序在…值之后会很快结束​​有但不代表分配。区域可用于新分配。内存不会消失。您希望发生什么?不完全相同,但第一个答案是:这些是垃圾值。内存“不再属于您”在删除之后,但是没有人说当你释放它时它必须被删除。此外,这将是一个分段错误,你的编译器可能忽略了“delete[]”行,因为程序在…值之后很快结束​​有但不代表分配。区域可用于新分配。内存不会消失。你期望会发生什么?不完全相同,但第一个答案是启发性的。这都是很好的建议,但似乎没有回答这个问题,这就是为什么这些值仍然可见的原因。对语言来说是新手年龄可能不理解“未定义的行为”的真正含义。@AdrianMcCarthy:这是UB…任何东西goes@AdrianMcCarthy当前位置我的编辑可能会缓解任何担忧“这是UB…任何事情都会发生。”你知道。我们知道。询问者可能不理解。我想编辑更好。删除内存只是说明内存可以分配给其他用途。这是不准确的。在某些实现中,它可能是正确的。但在其他实现中,它将不会是正确的。@GIJoe谢谢!我现在清楚了。我担心,当然是bui先把内存放好。谢谢!这都是很好的建议,但似乎并没有回答问题,这就是为什么这些值仍然可见。不懂这种语言的人可能不明白“未定义的行为”到底意味着什么。@AdrianMcCarthy:这是UB..什么goes@AdrianMcCarthy当前位置我的编辑可能会缓解任何担忧“这是UB…任何事情都会发生。”你知道。我们知道。询问者可能不理解。我想编辑更好。删除内存只是说明内存可以分配给其他用途。这是不准确的。在某些实现中,它可能是正确的。但在其他实现中,它将不会是正确的。@GIJoe谢谢!我现在清楚了。我担心,当然是bui先把记忆储存起来,谢谢!