这看似简单的问题,但我的 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。

07-24 09:51
查看更多