int *ptr = new int(10);
printf("%d \n",*ptr);
delete ptr,ptr=0;
printf("%d",ptr);
输出:
10个
0
我的问题是这个判断"删除ptr,ptr = 0"工作?它会释放两次内存吗?
答案 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 ptr
,ptr
仍将指向内存中可能包含垃圾信息的位置。
答案 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"指针,所以你不会得到任何奇怪/意外的行为