【发布时间】:2010-10-16 18:20:32
【问题描述】:
好吧,我想我们都同意以下代码发生的事情是未定义的,取决于传递的内容,
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)。
那么记住这些事情是谁的工作?操作系统是否在后台保留某种类型的记录? (我的意思是,我意识到我在开始这篇文章时说发生的事情是不确定的,但事实是,“杀戮狂欢”场景不会发生,因此在现实世界中 someone记住。)
【问题讨论】:
-
从方括号中知道删除后
-
“指针是一个数组”。不,指针永远不是数组。它们通常指向数组的第一个元素,但那是另一回事。
标签: c++ arrays pointers new-operator delete-operator