我想知道如何解释
0xffffffffffffffff
(在回溯中)
我知道:
从
0
/ nullptr
读取的地址无效。从
0x58
读取,删除那里的对象后,会导致访问冲突,因为我不拥有该内存位置。所以对于
0xffffffffffffffff
,我知道/假设:
object* obj;
将在堆栈上创建类型为 object* 的指针,值 0
/ nullptr
。object* obj = new object()
会在堆上创建对象,将指向它的指针存储在 obj
中,并具有像 000000000BD0ADA0
这样的有效地址 - 需要在某个时候用 delete obj
删除。0xffffffffffffffff
二进制全为 1。问题:我怎样才能得到
0xffffffffffffffff
0xffffffffffffffff
?就我的具体情况而言,是这样的:
CustomItem* name_item = new CustomItem (i, elems[i]);
CustomItem (int sort_val, MyObject *obj) : _sort_val (sort_val), _mobj(obj) { }
model->setItem (i, 0, name_item);
#0 Qt5Gui public: void cdecl QStandardItemModel::setItem(int,int,class QStandardItem * ptr64) ptr64 +0xd (ip 0x7fee721bcfd fp 0x168470)
评论:这可能是一个未初始化的指针。
我发现:
Object* obj; // is 0
但是:
Object* obj1; // is 0
Object* obj2 = new Object(); // is 000000000BF6F100 (some valid address)
Object* obj3; // is 000000000BF6F100
结论:
Object* obj;
不保证为0。
编译器或调试器可能会替换指向
0xffffffffffffffff
的未初始化指针。显然仅在某些情况下,因为我无法在一个简单的示例中重现它。我想要一些 C++ 规范、编译器规范或者 Visual Studio 调试器的链接,以证明这一点。
目前可用的 x86_64 CPU 仅实现 48 位地址空间,而不是完整的 64 位。
如果取消引用硬件地址空间之外的指针,则会引发错误。 Windows 将此报告为访问冲突,但将地址参数传递为 0xffffffffffffffff,而不是真正的无效地址。
如果声明任何变量但不初始化它,它的值可能是随机堆栈垃圾。如果您声明一个指针并且不初始化它,它可以有效地指向一个随机地址,并且该地址可以位于硬件地址空间之外。
如果您确实想知道正在访问哪个地址,您可以查看反汇编以查看正在访问哪个寄存器,然后查看该寄存器的值。