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

C++ C++;什么是删除指针,指针=0;报表工作?它能清除两次记忆吗?,c++,C++,输出: 10 0 我这里的问题是“删除ptr,ptr=0”是如何工作的?它会释放内存两次吗?释放内存,然后将指针设为空,这样就不会让人混淆指针仍然指向有效位置。请注意,x,y的计算方法与x相同;y,唯一的区别是前者不适用于语句(并且是表达式本身) 在ptr指向的地址释放内存。但是,ptr仍然指向该内存地址 delete ptr ptr不再指向特定的内存地址 delete ptr 因此,ptr=0的要点是使程序员能够测试指针是否仍然可用(正在使用)。如果不设置ptr=0,而只设置delete

输出:
10
0


我这里的问题是“删除ptr,ptr=0”是如何工作的?它会释放内存两次吗?

释放内存,然后将指针设为空,这样就不会让人混淆指针仍然指向有效位置。请注意,
x,y
的计算方法与
x相同;y
,唯一的区别是前者不适用于语句(并且是表达式本身)

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

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

delete ptr

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

不,不会。在C++中,它是。引自维基:

<>在C语言和C++编程语言中,逗号运算符 (由标记表示)是一个二进制运算符,用于计算其 第一个操作数并丢弃结果,然后对第二个操作数求值 并返回此值(和类型)

因此,在该声明中

ptr = 0
相当于

delete ptr, ptr = 0;

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

int*ptr=newint(10)

ptr的值类似于0xabcd1234,但*ptr将为10 您可以使用内存地址0xabcd1234“执行任务”,因为它是分配给您的

printf(“%d\n”,*ptr)
删除ptr,ptr=0

删除ptr“返回”内存,但仍保留其地址(这很危险)。 ptr=0表示您忘记了地址,所以一切正常


我猜“诀窍”是逗号运算符:
delete ptr,ptr=0;
正如其他人所说的意思是“先做左手部分,然后做右手部分”。如果你试图得到一个结果(
int I\u know\u it\u is\u dumble\u example=10,20;
结果就是RHS[20])语句
delete ptr
将使指针成为
悬垂指针
。这表示您不能再使用指针,但现在实际上它仍然指向有效的内存地址。因此,您需要使用
ptr=0
使其成为
nullptr
。这始终是使用
ptr的安全方法e> 。我希望这能对您有所帮助。

删除ptr将释放动态分配的内存,而ptr=0确保指针现在是“空”指针,这样您就不会出现任何奇怪/意外的行为。

int(10)是错误的。如果您想为10 int分配内存,那么就执行int*ptr=new int[10];但如果您想创建一个值为10的整数,
new int(10)
就可以了。@KhairulBasarRofi:它为一个整数分配空间,值为
10
。它不是数组,也不是数组。我只想创建一个int值。这很私人,但我通常更喜欢NULL(或者更好:nullptr)而不是0来表示空指针。我发现它更明确、更“标准”。它不仅“忘记地址”,还专门将其分配给sentinel(
0
)值,通常用于指示指针未指向有效对象。
NULL
可用于此目的,因为它保证永远不会是有效地址。在过去,我们有一盒0和1,用来敲入一根长金属管来编写程序。在那些日子里,我们的HP机器有一个特定的compiler选项,这意味着您可以读取*0(它总是返回0)并写入0(这是一个NOP)。在我们移植到SunOS并开始到处崩溃之前,我们从不知道makefile启用了该选项;-)很好地解释了逗号运算符,但有点简洁,可以正确地解释什么是不可用的。
delete ptr; // executed first, its return value is ignored
ptr = 0;    // the return value of '=', which is '0' is returned by ',' operator