好吧,我认为我们都同意,根据所传递的内容,未定义以下代码所发生的情况,
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)。
那么记住这些事情是谁的工作呢?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我在开始这篇文章时是说发生的事情是不确定的,但事实是,“杀人狂潮”的情况没有发生,因此在实际世界中有人会记住。) 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
编译器不知道它是一个数组,而是在信任程序员。删除指向intwith 的指针delete []将导致未定义的行为。您的第二个main()示例是不安全的,即使它不会立即崩溃。
编译器必须跟踪需要删除多少个对象。它可以通过过度分配足够的空间来存储数组大小来实现此目的。有关更多详细信息,请参见C ++ Super FAQ。