Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除指针后,它仍在C++;在MacOSX中使用Xcode_C++_Xcode_Macos_Delete Operator - Fatal编程技术网

C++ 删除指针后,它仍在C++;在MacOSX中使用Xcode

C++ 删除指针后,它仍在C++;在MacOSX中使用Xcode,c++,xcode,macos,delete-operator,C++,Xcode,Macos,Delete Operator,可能重复: 考虑以下代码:- #include <iostream> class Test { public: int k=10; }; int main(int argc, const char * argv[]) { Test *t = new Test(); delete t; //t1 = NULL; t->k=50; printf("\n%d",t->k); return 0; } #包括 课堂测试

可能重复:

考虑以下代码:-

#include <iostream>
class Test
{
public:
    int k=10;
};

int main(int argc, const char * argv[])
{
    Test *t = new Test();
    delete t;
    //t1 = NULL;
    t->k=50;
    printf("\n%d",t->k);
    return 0;
}
#包括
课堂测试
{
公众:
int k=10;
};
int main(int argc,const char*argv[]
{
测试*t=新测试();
删除t;
//t1=NULL;
t->k=50;
printf(“\n%d”,t->k);
返回0;
}
虽然删除了
t
,但其输出为
50
。 为什么它没有崩溃?
我在Mac OS x中使用Xcode。

这是一种未定义的行为,你不应该期望任何东西。然而,内存可能还没有被写入,它只是被标记为空闲,最终会被过度写入,这可能就是它工作的原因。将指针设置为
NULL
,这是一种很好的做法,为了避免此类陷阱,请查看问题所在。

,因为您(不)幸运。您正在调用未定义的行为。一种可能的未定义行为是“按预期工作”。然而,你的期望是可疑的。在delete和use之间添加一个函数调用,该函数在其中分配内存等等,您可能会因为判断错误的赋值而完全破坏其他一些数据

未定义的行为不必崩溃…也不必立即崩溃。但从长远来看,调用它通常会导致问题,尤其是在较大的程序中。

删除”只会通知堆管理器(除了调用析构函数外)sizeof(Test)的内存块以前使用new分配的内存将不再使用,heap-manger可以自由地处理该内存块

让我试着给你一个场景,当相同的代码可能导致异常

假设内存块是由堆管理器在新内存页上分配的,而堆管理器是从虚拟内存管理器获取的,因为它在先前分配的页面中找不到其他任何地方的可用空间。现在,当删除完成时,堆管理器会发现在内存页上分配的唯一块被释放,因此它可能决定将内存页释放回虚拟内存管理器。然后,当您的代码运行并访问虚拟内存中甚至不存在页面的内存时,您将得到一个错误


当然,通过对堆管理实现的深入了解,还可以提出其他方案

它会从内存中删除吗?为t=NULL;Neccessary@dkumar不是马上,但会被写下来的eventually@dkumar:操作系统将在需要时回收内存。将其设置为NULL是一种惯例,这样就不会有人在删除它后意外尝试访问它。因此,使用“NULL”检查来确定指针是否持有有效内存address@mux这最终什么时候才能真正起作用?它不会导致在运行时分配更多内存。它在VisualStudio中崩溃。它们使用不同的alloc和dealloc机制吗?@dkumar--内存立即被释放--可以立即重用。你没有泄露内存。但是,仅仅因为它可供重用并不意味着它将立即被重用。因为那个内存并没有真正被删除,它只被标记为“空闲”,在分配给其他用途之前,使用它不会使程序崩溃