关于C++中删除运算符的困惑

Des*_*tor 1 c++ arrays variable-assignment delete-operator

这看起来很简单,但我的朋友和我一起辩论,下面的程序会调用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';
}
Run Code Online (Sandbox Code Playgroud)

这个程序的行为是否定义得很好?如果我写delete [] p会发生什么?而不是删除[] q; ?有效吗?

Nat*_*ica 5

是的,该计划定义明确.首先,创建一个分配给新分配的内存的指针.

int* p=new int[3]();
Run Code Online (Sandbox Code Playgroud)

然后,您创建指向该内存的另一个指针

int* q=p;
Run Code Online (Sandbox Code Playgroud)

然后使用该指针将数据分配到该内存中.您删除的记忆是指针后,q这是相同的p这是好的.该计划返回,一切顺利

delete不关心你使用什么变量.重要的是指针指向的内存是用new你创建的,你只在内存上调用一次delete.