相关疑难解决方法(0)

delete []如何知道它是一个数组?

好吧,我想我们都同意以下代码所发生的事情是未定义的,具体取决于传递的内容,

void deleteForMe(int* pointer)
{
     delete[] pointer;
}
Run Code Online (Sandbox Code Playgroud)

指针可以是各种不同的东西,因此delete[]对它执行无条件是未定义的.但是,让我们假设我们确实传递了一个数组指针,

int main()
{
     int* arr = new int[5];
     deleteForMe(arr);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在这种情况下,指针一个数组,谁知道这个?我的意思是,从语言/编译器的角度来看,它不知道arr数组指针是否指向单个int的指针.哎呀,它甚至不知道是否arr是动态创建的.但是,如果我做以下事情,

int main()
{
     int* num = new int(1);
     deleteForMe(num);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

操作系统足够聪明,只能删除一个int,而不是通过删除超出该点的其余内存来进行某种类型的"杀戮狂欢"(与strlen\0终结字符串形成对比- 它将一直持续到它点击0).

那么他们的工作是记住这些东西吗?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我开始这篇文章时说过发生的事情是未定义的,但事实是,'杀戮狂欢'的情况不会发生,所以因此在实际世界中有人记得.)

c++ arrays pointers new-operator delete-operator

135
推荐指数
7
解决办法
13万
查看次数

标签 统计

arrays ×1

c++ ×1

delete-operator ×1

new-operator ×1

pointers ×1