最佳答案
好了,我想我们都同意下面的代码是未定义的,这取决于传递的代码,
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)。
那么谁来记住这些事情呢?操作系统是否在后台保存某种类型的记录?(我的意思是,我意识到我在开始这篇文章的时候说发生了什么是未定义的,但事实是,“杀戮狂欢”的情节并没有发生,因此在现实世界中 某人是记忆