这看似简单的问题,但我的 friend 与我辩论说,下面的程序调用UB。但是我认为他是不对的。
考虑以下程序:
#include <iostream>
int main()
{
int* p=new int[3]();
int* q=p;
for(int i=0;i<3;i++)
std::cout<<q[i]<<' ';
delete[] q;
std::cout<<'\n';
}
该程序的行为是否定义明确?如果我写 delete [] p会怎样? 代替 delete [] q; ?有效吗
最佳答案
是的,程序定义明确。首先,您创建一个分配给新分配的内存的指针。
int* p=new int[3]();
然后创建另一个指向该内存的指针
int* q=p;
然后,您可以使用该指针将数据分配到该内存中。之后,删除指向
q
的指针的内存,该指针与可以的p
相同。程序返回,一切顺利delete
不在乎您使用什么变量。重要的是,指针指向的内存是使用new
创建的,并且您只能在内存上调用一次delete。