簡體   English   中英

EXCEPTION_ACCESS_VIOLATION(從地址 0xffffffffffffffff 讀取)

[英]EXCEPTION_ACCESS_VIOLATION (read from address 0xffffffffffffffff)

我想知道如何解釋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)

評論:它可能是一個未初始化的指針。

我找到:

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 調試器,這證明了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM