EXCEPTION_ACCESS_VIOLATION(从地址0xffffffffffffffffff读取)

时间:2017-09-25 09:52:22

标签: c++ qt debugging memory access-violation

我想知道如何解释0xffffffffffffffff(在回溯中)

我知道:

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

  2. 0x58读取,删除对象后,将导致访问冲突,因为我没有内存位置。

  3. 因此对于0xffffffffffffffff,我知道/假设:

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

      结束
      1. 听起来像是下流或什么的,为什么?
      2. 这可能与编译器或调试器有关吗?
      3. 为什么是0xffffffffffffffff
      4. 我该如何理解?
      5. 在我的具体案例中,就像这样:

        1. CustomItem* name_item = new CustomItem (i, elems[i]);
        2. 自定义项构造函数
        3. 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)

1 个答案:

答案 0 :(得分: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调试器,这证明了这一点。