如果我去......
int *foo = new int;
foo += 1;
delete foo;
大部分时间它崩溃了。是否有一个原因?我试图让指针向前指向一个点(4个字节)。感谢。
编辑(六个月后):这是我在SO上提出的第一个问题,这是一个愚蠢的问题,值得投票。如果它对学习者没有用,可以将其删除。我确实在谈论在堆上分配四个字节的int,然后将指针向前移动四个字节,然后删除int指针,基本上删除上帝知道什么,导致未定义的行为。谢谢你的帮助。
答案 0 :(得分:6)
您可以安全地传递给delete
的唯一内容是您在拨打new
或nullptr
时获得的内容,在这种情况下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
更清楚地编写它,因此避免使用第二个指针变量。我如上所述编写它来说明当指针算法是正确的选项时你可能会编码。