在释放一些指针的同时,我获得了访问冲突 为了知道发生了什么,我决定要求在代码的早期阶段释放指针,甚至直接在分配了内存之后,它仍然会崩溃。 这意味着我的结构在内存中的处理方式存在严重错误。
我知道在以前版本的代码中,在定义某些变量之前有一个关键字,但该关键字丢失了(它是我无法找到的#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
)替换了它,但问题仍然存在。
答案 0 :(得分:0)
最后,经过长时间的痛苦,问题得以解决:
该程序最初是作为32位应用程序,这意味着原始类型unsigned long
足以保留内存地址。
但是,此程序现在被编译为64位应用程序,因此提到的类型不再足够大以保留64位内存地址,因此已使用另一种类型来解决此问题:
typedef intptr_t longword;
这解决了这个问题。
@Andrew Henle:对不起,我没有意识到你的评论包含了这个问题的实际解决方案。