为什么我有时会在指针中得到一个奇怪的地址

Why do I sometimes get a strange address in a pointer

本文关键字:一个 地址 指针 为什么      更新时间:2023-10-16

因此,我正在使用C++和openFrameworks。有时,当我试图获得一个指向类实例的指针时,通常会得到这样的结果(0000000003846B0)。或者,当它不存在时,它会返回一个nullptr。所有内容都经过编程,因此值可以是nullptr,也可以引用实际实例。

我总是将指针的值设置为头文件中的nullptr。

someClass* someInstance = nullptr;

当我删除一个实例时,在对该实例的任何引用中,我总是将其设置回nullptr。

但有时指针返回DDDDDDDDDD,这意味着应用程序将崩溃,因为它将通过我的safety if语句,这些语句在使用指针之前检查指针是否为nullptr。

有人知道DDDDDDDDDD是什么吗?我似乎找不到任何关于它的信息…

根据此页面:Win32调试CRT堆内部

记忆每个填充模式的含义的助记符:

新分配的内存(0xCD)是干净内存。

free()d内存(0xdd)是死内存。

保护字节(0xFD)就像内存周围的栅栏。

因此,假设您的平台是Win32,那么指针所在的内存似乎被释放了。

这表明你一直在访问无效内存,在这种情况下,你会有未定义的行为。

指针本身必须是其他对象中的成员。指针所属的整个对象已被删除,但您仍在使用它。

因此,观察指针的使用及其指向的东西的症状、删除和创建,离问题只有一个层次的距离。

您应该查找指针所属对象的删除。

myHello是一个对象指针并且conc_2D_ P是这里的方法
cout << "Check1 " << (myHello->conc_2D_P);
delete myHello;
cout << "Check2 " << (myHello->conc_2D_P)<<endl;

在运行这个片段时,我们得到的输出

支票0000017C3EF89A70

检查2 DDDDDDDDDD DDDDDD

在第二行代码中,我们删除了整个对象指针,但在下一行中,我们再次尝试访问它,从而访问DDDDDDDDDD。