删除指向堆的指针时程序崩溃

Program crashes when deleting a pointer pointing to the heap?

本文关键字:程序 崩溃 指针 删除      更新时间:2023-10-16

如果我去。。。

int *foo = new int;  
foo += 1; 
delete foo;    

大多数时候它都会崩溃。这是有原因的吗?我试着让指针向前一点(4字节)。谢谢

编辑(六个月后):这是我在SO上问的第一个问题,这是一个愚蠢的问题,应该被否决。如果对学习者没有任何用处,可以将其删除。我说的确实是在堆上分配一个四字节的int,然后将指针向前移动四个字节,然后删除int指针,本质上是删除天知道的东西,导致未定义的行为。谢谢你的帮助。

您唯一可以安全地传递给delete的是当您调用newnullptr时得到的东西,在这种情况下,delete不会执行任何操作。

您更改了指针的值,因此它不是"调用new时得到的东西"

必须将new返回的值传递给delete。你不会那样做的。

我认为您对传递给delete的内容感到困惑。我认为您相信delete foo会删除与变量相关联的内存。事实并非如此。它删除地址存储在foo中的存储器。

例如,这是合法的:

int* foo = new int;
int* bar = foo;
delete bar;

重要的不是变量的名称,而是变量的值。

下面是另一个例子:

int* arr = new int[10];
int* ptr = arr;
for (int i; i < 10; i++)
{
    *ptr = i;
    ptr++;
}
delete[] arr;

为了执行指针运算,并保留new[]返回的地址,我们引入了一个额外的变量。我之所以使用数组,是因为对指向单个值的指针执行算术运算是没有意义的。

请注意,在上面的代码中,可以使用arr[i] = i更清楚地编写它,从而避免需要第二个指针变量。我按照上面的方式编写它,以说明当指针算术是正确的选项时,如何进行编码。