簡體   English   中英

為什么在分配內存后直接釋放時出現訪問沖突異常

[英]Why the access violation exception when freeing directly after allocating memory

在釋放一些指針的同時,我遇到了訪問沖突。
為了知道發生了什么,我決定要求在代碼的早期階段釋放指針,甚至直接在分配了內存之后,它仍然會崩潰。
這意味着我的結構在內存中的處理方式存在嚴重錯誤。

我知道在以前版本的代碼中,在定義某些變量之前有一個關鍵字,但該關鍵字丟失了(它是我找不到的#define子句的一部分)。

有人知道這段代碼有什么問題或提到的關鍵字應該是什么?

typedef unsigned long longword;
typedef struct part_tag { struct part_tag *next;
                                 __int64 fileptr;
                                 word needcount;
                                 byte loadflag,lock;
                                 byte partdat[8192];
                                 } part;

static longword *partptrs;

<keyword> part *freepart;
<keyword> part *firstpart;

void alloc_parts (void) {
  part *ps;
  int i;

  partptrs = (longword*)malloc (number_of_parts * sizeof(longword)); // number... = 50
  ps = (part*)&freepart;

  for (i=0; i<number_of_parts; i++) {
    ps->next = (struct part_tag*)malloc(sizeof(part));
    partptrs[i] = (longword)ps->next;
    ps = ps->next;
    ps->fileptr = 0; ps->loadflag = 0; ps->lock = 0; ps->needcount = 0; // fill in "ps" structure
  };
  ps->next = nil;
  firstpart = nil;
  for (i=0; i<number_of_parts; i++) {
    ps = (part*)partptrs[i];
    free(ps); <-- here it already crashes at the first occurence (i=0)
  };

}

提前致謝

在評論中,有人問為什么我在分配它們后直接釋放指針。 這不是程序最初的編寫方式,而是為了知道導致訪問沖突的原因,我已經用這種風格重寫了。
本來:

alloc_parts();
<do the whole processing>
free_parts();

為了分析訪問沖突,我已經將alloc_parts()函數改編成我在那里寫的源代碼摘錄。 關鍵是即使在分配內存之后,釋放也會出錯。 這怎么可能呢?

與此同時,我發現了另一種奇怪的現象:
在分配內存時, ps的值似乎是“完整的”地址值。 在嘗試釋放內存時, ps的值僅包含內存地址的最后一位數字。

Example of complete address :        0x00000216eeed6150
Example of address in freeing loop : 0x00000000eeed6150 // terminating digits are equal,
                                                        // so at least something is right :-)

此問題是由longword類型引起的:似乎此類型太小而無法容納整個內存地址。 我用另一種類型( unsigned long long )替換了它,但問題仍然存在。

最后,經過長時間的苦難,問題解決了:

該程序最初是作為一個32位應用程序,這意味着原始類型unsigned long足以保留內存地址。

但是,此程序現在被編譯為64位應用程序,因此提到的類型不再足夠大以保留64位內存地址,因此已使用另一種類型來解決此問題:

typedef intptr_t longword;

這解決了這個問題。

@Andrew Henle:對不起,我沒有意識到你的評論包含了這個問題的實際解決方案。

暫無
暫無

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

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