double-free
design twitter----对结构体指针进行清除时:
...
if (obj && obj->tweet) free(tweet);
if (obj && obj->user) free(user);
if(obj) free(obj);
...
其中tweet及obj都是结构体指针,tweet为链表表头,但user为结构体指针数组。
#define MAX_SIZE 1024
struct User {
int userid;
int followee[MAX_SIZE];
};
struct tweet {
int userid;
int tweetid;
struct tweet *next;
};
// 改用User数组保存用户及其关注的人
typedef struct {
struct User *user[MAX_SIZE];
struct tweet *tweet;
} Twitter;
因为静态数组在程序结束时会自动清除,猜测应该是free(obj->user)
实际上执行的是free(obj)
所以出现了double-free的情况。
因为*user[1024]
为静态数组,所以不应该使用free
,但出现的错误多种多样。
如果先进行free(obj->tweet)
再free(obj->user)
会出现heap-use-after-free。
但是如果把结构体定义中,struct Tweet *tweet;
放到struct User *user[MAX_SIZE];
前面,则会出现attempting free on adress which was not malloc()