好吧,我想我们都同意,根据所传递的内容,未定义以下代码所发生的情况,
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,而不会通过删除超出该点的其余内存来进行某种“杀戮狂潮”(与strlen
和非\0
终止字符串进行对比),它将一直持续到点击0)。
那么记住这些事情是谁的工作呢?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我在开始这篇文章时首先说的是发生的事情是不确定的,但事实是,“杀人狂潮”的情况没有发生,因此在实际世界中有人会记住。)