关于Free的问题,不知道错在哪儿了:(
#include <stdio.h>
#include <malloc.h>
typedef struct Elem
{
int num;
Elem* next;
}*Elem_Struct;
void main()
{
Elem_Struct temp;
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));
temp->num = 10;
temp->next = NULL;
free(temp);
}
运行这段代码,free的时候是错误的,如果把temp->next = NULL;去掉就可以了,为什么啊,搞不懂啊搞不懂!!!我分不多,只有给5分了:)
问题点数:5、回复次数:14Top
1 楼duduhaha(三人行必有我师)回复于 2006-06-02 22:28:07 得分 0
temp = (Elem_Struct)malloc(sizeof(struct Elem));
你写的程序是为个指针分配空间,而不是为结构体分配空间.Top
2 楼lsea_2006()回复于 2006-06-02 22:43:32 得分 0
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));错了!Top
3 楼qifa(DoItNow)回复于 2006-06-02 22:45:44 得分 0
同意楼上的,
至于你说的如果把temp->next = NULL;去掉就可以了,只是巧合罢了,你跟踪free函数进去你就会发现为什么了.
因为你为一个指针分配了4个字节的内存空间(目前指针占4个字节),紧接着后面的4个字节是堆分配结束标记fd fd fd fd,如果你没有执行temp->next = NULL,那么标记没有被破坏,一旦你执行了temp->next = NULL,标记被破坏变成了00 00 00 00,就会引发错误:
if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
_RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%p.\n",
szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
pHead->lRequest,
(BYTE *) pbData(pHead));
//-----------
此时的bCheck=253,刚好是0x0fd
static int __cdecl CheckBytes(
unsigned char * pb,
unsigned char bCheck,
size_t nSize
)
{
int bOkay = TRUE;
while (nSize--)
{
if (*pb++ != bCheck)
{
/* Internal error report is just noise; calling functions all report results - JWM */
/* _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */
/* (BYTE *)(pb-1),*(pb-1), bCheck); */
bOkay = FALSE;
}
}
return bOkay;
}Top
4 楼haolix(獾猪搂主)回复于 2006-06-02 23:06:14 得分 0
楼上的说得很好Top
5 楼lj860603(跑吧,键键)回复于 2006-06-02 23:22:31 得分 0
TO:qifa()
赞一个:)Top
6 楼oosky2004(我要好东西)回复于 2006-06-03 10:11:18 得分 0
qifa()
赞一个。Top
7 楼Levinzhou(Levinzhou)回复于 2006-06-03 13:09:25 得分 0
#include <stdio.h>
#include <malloc.h>
typedef struct Elem
{
int num;
Elem* next;
}Elem_Struct;
void main()
{
Elem_Struct *temp;
temp = (Elem_Struct*)malloc(sizeof(Elem_Struct));
temp->num = 10;
temp->next = NULL;
free(temp);
}
哪为什么改成这样又是正确的呢?只不过一个定义为*Elem_Struct,一个是Elem_Struct,对temp
而言不都是一样的吗?Top
8 楼sarh2os()回复于 2006-06-03 13:25:06 得分 0
LZ你typedef的用法掌握的不好啊
typedef struct Elem
{
int num;
Elem* next;
}*Elem_Struct;
这句表示 Elem_Struct 代表 struct Elem *类型(指针类型)
typedef struct Elem
{
int num;
Elem* next;
}Elem_Struct;
这句表示 Elem_Struct 代表 struct Elem 类型(结构体类型)
最开始你这句话:
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));
错就错在没有为一个结构体而是为一个指针分配的空间。
Top
9 楼laiwusheng(风清扬)回复于 2006-06-03 13:31:03 得分 0
typedef struct Elem
{ ...
}*Elem_Struct;
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));
分配时系统是给一个指向结构体的指针分配的空间占4字节。
typedef struct Elem
{ ...
}Elem_Struct;
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));
此时,是给一个结构体分配的空间占6字节。
在编译时系统自动在结构体后加了两字节的空间,存放一些编译信息,
释放时产生了字节对齐的问题,无法释放。Top
10 楼Levinzhou(Levinzhou)回复于 2006-06-03 18:50:50 得分 0
找到原因了,改成这样就对了。
temp = (Elem_Struct)malloc(sizeof(Elem));
谢谢楼上回答的兄弟们。怎么给分啊?
Top
11 楼sinkileu(小心)回复于 2006-06-04 11:59:10 得分 0
typedef struct Elem
{
int num;
Elem* next;
}Elem_Struct, *Elem_Ptr;
Elem_Ptr = (Elem_Ptr)malloc(sizeof(Elem_Struct));Top
12 楼sinkileu(小心)回复于 2006-06-04 12:00:33 得分 0
丢了个temp:
typedef struct Elem
{
int num;
Elem* next;
}Elem_Struct, *Elem_Ptr;
Elem_Ptr temp= (Elem_Ptr)malloc(sizeof(Elem_Struct));
Top
13 楼voxforce(阿便)回复于 2006-06-04 14:53:26 得分 0
temp = (Elem_Struct)malloc(sizeof(Elem_Struct));
这一行错了。Top
14 楼chengzanmiao(高薪為共產當多納稅)回复于 2006-06-04 20:23:48 得分 0
duduhaha(三人行必有我师)
正解Top




