删除运算符在我的代码中如何工作?

use*_*647 0 c++ memory-management

如果要delete释放内存,那么为什么前两个元素被重置为其初始垃圾值,而其余两个元素却没有?删除指针后,我得到异常输出。请解释它是如何工作的以及为什么我得到这样的输出。

#include<iostream>

using namespace std;

int main()
{
    int i;
    int *q = new int[10];
    int *r;
    r=q;
    printf("%d %d\n",*r,*(r+1));

    for(i=0;i<10;i++)
        q[i]=100;

    delete[] q;

    for(i=0;i<10;i++)
    {
        cout<<"r="<<*(r+i)<<"   ";
        cout<<"q="<<*(q+i)<<"\n";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码输出如下:

8389928 8388800 r = 8389928 q = 8389928 r = 8388800 q = 8388800 r = 100
q = 100 r = 100 q = 100 r = 100 q = 100 r = 100 q = 100 r = 100 q = 100 r = 100
q = 100 r = 100 q = 100 r = 100 q = 100

Rei*_*ica 8

您的代码具有未定义的行为(这意味着它有错误,实际上什么都可能发生),原因有几个。

  1. 您正在通过打印读取未初始化的内存,*r然后*(r+1)再将任何内容分配给这些对象。new int[]不会以任何方式初始化分配的内存:必须先分配值,然后才能读取它。

    顺便说一句,请注意,*(r+1)通常写为r[1]

  2. (问题编辑后,该部分不再适用)您已使用分配了内存new [],但您已使用取消分配了内存deletenew[]必须始终与配对delete[](和newdelete)。

  3. 通过取消引用rq删除q(和r)指向的内存(即使您使用了正确的delete[] q;),您正在访问不再拥有的内存。释放内存后,将不再允许您访问其内容。

  • 在如此短的程序中可以容纳多少个严重的错误,这令人惊讶。 (7认同)