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

时间:2015-03-22 08:34:46

标签: c++ pointers

如果我去......

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

大部分时间它崩溃了。是否有一个原因?我试图让指针向前指向一个点(4个字节)。感谢。

编辑(六个月后):这是我在SO上提出的第一个问题,这是一个愚蠢的问题,值得投票。如果它对学习者没有用,可以将其删除。我确实在谈论在堆上分配四个字节的int,然后将指针向前移动四个字节,然后删除int指针,基本上删除上帝知道什么,导致未定义的行为。谢谢你的帮助。

2 个答案:

答案 0 :(得分:6)

您可以安全地传递给delete的唯一内容是您在拨打newnullptr时获得的内容,在这种情况下delete赢了做任何事。

您更改了指针的值 - 因此它不是您在调用new"

时获得的内容

答案 1 :(得分:5)

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

我认为您对传递给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更清楚地编写它,因此避免使用第二个指针变量。我如上所述编写它来说明当指针算法是正确的选项时你可能会编码。