EXCEPTION_ACCESS_VIOLATION(从地址 0xffffffffffffffff 读取)

问题描述 投票:0回答:2

我想知道如何解释

0xffffffffffffffff
(在回溯中)

我知道:

  1. 0
    /
    nullptr
    读取的地址无效。

  2. 0x58
    读取,删除那里的对象后,会导致访问冲突,因为我不拥有该内存位置。

所以对于

0xffffffffffffffff
,我知道/假设:

  1. 这是一个64位指针
  2. 其后面的对象可能没有被删除
  3. object* obj;
    将在堆栈上创建类型为 object* 的指针,值
    0
    /
    nullptr
  4. object* obj = new object()
    会在堆上创建对象,将指向它的指针存储在
    obj
    中,并具有像
    000000000BD0ADA0
    这样的有效地址 - 需要在某个时候用
    delete obj
    删除。
  5. 0xffffffffffffffff
    二进制全为 1。

问题:我怎样才能得到

0xffffffffffffffff

  1. 听起来像是下溢什么的,为什么?
  2. 这可能与编译器或调试器有关吗?
  3. 这是为什么
    0xffffffffffffffff
  4. 我该如何解释?

就我的具体情况而言,是这样的:

  1. CustomItem* name_item = new CustomItem (i, elems[i]);
  2. 自定义项目构造函数

CustomItem (int sort_val, MyObject *obj) : _sort_val (sort_val), _mobj(obj) { }

  1. model->setItem (i, 0, name_item);
  2. #0 Qt5Gui public: void cdecl QStandardItemModel::setItem(int,int,class QStandardItem * ptr64) ptr64 +0xd (ip 0x7fee721bcfd fp 0x168470)
c++ qt debugging memory access-violation
2个回答
0
投票

评论:这可能是一个未初始化的指针。

我发现:

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 调试器的链接,以证明这一点。


0
投票

目前可用的 x86_64 CPU 仅实现 48 位地址空间,而不是完整的 64 位。

如果取消引用硬件地址空间之外的指针,则会引发错误。 Windows 将此报告为访问冲突,但将地址参数传递为 0xffffffffffffffff,而不是真正的无效地址。

如果声明任何变量但不初始化它,它的值可能是随机堆栈垃圾。如果您声明一个指针并且不初始化它,它可以有效地指向一个随机地址,并且该地址可以位于硬件地址空间之外。

如果您确实想知道正在访问哪个地址,您可以查看反汇编以查看正在访问哪个寄存器,然后查看该寄存器的值。

© www.soinside.com 2019 - 2024. All rights reserved.