好的,我认为我们都同意以下代码发生的情况是未定义的,具体取决于传递了什么参数。
void deleteForMe(int* pointer)
{
delete[] pointer;
}
指针可能是各种不同的东西,因此在其上执行无条件的delete[]
是未定义的。但是,让我们假设我们确实传递了一个数组指针,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
我的问题是,在指针 是 数组的情况下,谁知道这一点呢?我的意思是,从语言/编译器的角度来看,它不知道 arr
是数组指针还是指向单个 int 的指针。甚至它也不知道 arr
是否是动态创建的。然而,如果我做以下操作,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
操作系统足够聪明,只会删除一个 int 而不会像删除非 '\0' 结尾的字符串时那样继续删除内存中该点后面的所有内容(这种情况下,程序会一直执行到碰到 0 字符)。
那么是谁来记住这些事情?操作系统在后台保留某种记录吗?(我知道,我之前说过这种情况是未定义的,但实际上,“疯狂删除”这种情况并没有发生,因此在实践中,某个人在记住这些事情。)