C ++删除指针是什么,指针= 0;声明工作?它清除记忆两次吗?

时间:2015-07-30 03:34:39

标签: c++

int *ptr = new int(10);    
printf("%d \n",*ptr);    
delete ptr,ptr=0;    
printf("%d",ptr);   

输出:
10个
0

我的问题是这个判断"删除ptr,ptr = 0"工作?它会释放两次内存吗?

6 个答案:

答案 0 :(得分:4)

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

int *ptr = new int(10);

ptr将具有类似0xabcd1234的值,但* ptr将为10 你可以"做东西"内存地址为0xabcd1234,因为它已分配给您。

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

删除ptr"给予"记忆,但你仍然有它的地址(那是危险的。 ptr = 0意味着你忘记了地址,所以一切都很好。

我想"技巧"是逗号运算符:delete ptr,ptr=0;正如其他人所说的那样意味着"做左手部分,然后是右手部分。"如果您尝试获得结果(int i_know_it_is_a_stupid_example = 10,20;结果是RHS [20])

答案 1 :(得分:3)

delete ptr

释放ptr指向的地址的内存。但是,ptr仍然指向该内存地址。

ptr = 0

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

因此,ptr = 0的要点是让程序员能够测试指针是否仍然可用(正在使用中)。如果您未设置ptr = 0,但只设置delete ptrptr仍将指向内存中可能包含垃圾信息的位置。

答案 2 :(得分:3)

不,它不会。在C ++中,它是comma operator。来自wiki的报道:

  

在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

答案 3 :(得分:1)

释放内存,然后使指针为空,这样就没有人会对指针仍然指向有效位置感到困惑。请注意,x, y的评估与x; y相同,唯一的区别是前者不能与语句一起使用(并且是表达式本身)。

答案 4 :(得分:0)

语句delete ptr将使指针变为overhang pointer。这代表你不能再使用指针,但实际上它仍然指向一个有效的内存地址。因此,您需要使用ptr=0将其设为nullptr。这始终是使用ptr的安全方式。我希望这可以帮到你。

答案 5 :(得分:0)

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