繁体   English   中英

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

[英]Confusion about delete operator in C++

这看似简单的问题,但我的朋友与我辩论说,下面的程序调用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。

new[]运算符返回的指针不是分配的内存的开始,而是指向第一个对象(或索引为0的对象)。 现在, 基于您使用的编译器 ,运行时系统将对象数n存储在某个位置,如果您只知道p指向的内存位置,则可以在其中检索该对象。

根据此博客 ,删除向量反过来执行此操作:

当您执行“ delete [] p”时,您的意思是“ p指向一堆对象,但我没有告诉您有多少对象。” 在这种情况下,编译器需要生成额外的代码来跟踪需要销毁的代码数量。 当使用“ new []”分配向量时,这些额外的信息将保留在“秘密位置”。

由于执行int *q = p本质上指向同一数组的第0个对象,因此等效于调用delete[] qdelete[] p

没有UB。 它将正常工作。 在此处添加的内容不多。

运算符delete只能应用于由运算符new分配的内存(即地址)。 如果分配一次,则还应该释放(删除)一次,因此不会使用哪个指针(变量存储地址),因此您的代码有效。

但是,请记住,在delete[] q之后,不必使用qp 最好的方法是将NULL分配给两个指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM