什么是delete指针,指针=0;表述功?它清除内存两次吗?

C++ What does delete pointer,pointer=0; statement work ? Does it clear memory twice?

本文关键字:指针 内存 清除 两次 delete 什么      更新时间:2023-10-16
int *ptr = new int(10);    
printf("%d n",*ptr);    
delete ptr,ptr=0;    
printf("%d",ptr);   

输出:10
0

我的问题是这个语句"delete ptr,ptr = 0"是如何工作的?

指针和指针指向的内存是两个不同的东西。在删除指针后将其设置为0只是一个额外的安全机制,以确保您不会尝试使用不应该使用的内存地址。

int *ptr = new int(10);

ptr的值为0xabcd1234,但*ptr的值为10您可以使用内存地址0xabcd1234"做一些事情",因为它是分配给您的。

printf("%d n",*ptr);
delete ptr,ptr=0;

delete PTR"还给"内存,但你仍然有它的地址(这是危险的_。PTR = 0表示您忘记了地址,所以一切都很好。

我猜"诀窍"是逗号操作符:delete ptr,ptr=0;,正如其他人所说的意思是"做左边的部分,然后做右边的部分。"如果你试图得到一个结果(int i_know_it_is_a_stupid_example = 10,20;的结果是RHS [20])

delete ptr

释放ptr所指向地址的内存。然而,ptr仍然指向那个内存地址。

ptr = 0

ptr不再指向特定的内存地址。

因此,ptr = 0的目的是使程序员能够测试指针是否仍然可用(在使用中)。如果您不设置ptr = 0,而只设置delete ptr,那么ptr仍然会指向内存中可能包含垃圾信息的位置。

不会的。在c++中,它是逗号操作符。引用自维基:

在C和c++编程语言中,逗号操作符(由令牌表示,)是一个求其值的二进制运算符第一个操作数并放弃结果,然后计算第二个操作数操作数并返回该值(和类型)。

因此,在语句

delete ptr, ptr = 0;

等价于

delete ptr; // executed first, its return value is ignored
ptr = 0;    // the return value of '=', which is '0' is returned by ',' operator

释放内存,然后清空指针,这样就没有人会觉得指针仍然指向一个有效的位置。请注意,x, y的求值与x; y相同,唯一的区别是前者不能与语句一起工作(并且本身是一个表达式)。

语句delete ptr将使指针变为overhang pointer。这意味着你不能再使用指针了,但实际上它仍然指向一个有效的内存地址。因此,您需要使用ptr=0使其成为nullptr。这始终是使用ptr的安全方法。我希望这对你有帮助。

Delete ptr将释放动态分配的内存,而ptr=0确保指针现在是一个"null"指针,所以你不会得到任何奇怪的/意外的行为