使用 fclose() 后损坏的双链表;
corrupted double-linked list after use fclose();
我的程序有问题。
使用函数 fclose()
后出现错误:
"* Error in `./server': corrupted double-linked list: 0x000000000251a230 *
Przerwane (zrzut pamięci)"
如果我删除 fclose()
功能,一切都很好。
这是我的功能代码:
FILE *fHandler;
struct udp_message **returnArray;
struct udp_message *message;
char *line = NULL;
uint32_t linesNum;
uint32_t i = 0;
size_t length;
ssize_t read;
fHandler = fopen(filePath, "r");
if (fHandler == NULL) {
perror("ERROR");
return NULL;
}
returnArray = malloc(sizeof(struct udp_message *)*CONSOLE_BUFFER);
message = malloc(sizeof(struct udp_message));
while ((read = getline(&line, &length, fHandler)) != -1) {
message = (struct udp_message *)line;
if (message->messageTime < aboveTime) {
continue;
}
returnArray[i] = malloc(sizeof(struct udp_message));
memcpy(returnArray[i++], message, sizeof(struct udp_message));
}
memcpy(messageNum, &i, sizeof(i));
fclose(fHandler);
return returnArray;
可能值得检查对象是否为空
if(fHandler != NULL)
fclose(fHandler);
您不太可能使用 getline
读取二进制 UDP 消息。 while
循环有可能迭代超过 CONSOLE_BUFFER
次并且您写入超出 returnArray
的末尾,从而破坏堆内部结构。 fclose()
释放与流关联的缓冲区,free
由于堆损坏而崩溃。
顺便说一下,memcpy(messageNum, &i, sizeof(i));
可能是不正确的。您没有 post 函数原型,但您应该使用 *messageNum = i;
设置存储在 returnArray
中的消息数,特别是如果类型不是 uint32_t *
.
查看你的这部分代码-
message = malloc(sizeof(struct udp_message)); /* <--- 1 */
while ((read = getline(&line, &length, fHandler)) != -1) {
message = (struct udp_message *)line; /* <--- 2. */
if (message->messageTime < aboveTime) {
continue;
}
您将内存分配给 message
(请参阅第 1.
点),但随后在 while
循环中您将其指向 line
(第 2.
点) ).
因此您丢失了对先前分配的内存的引用(并且这两个指针都指向相同的内存位置),因此如果您 free
它们,它将free
相同的内存导致双 free
相同的内存位置。
所以,如果你想让message
指向line
,那就不要给message
分配内存。
我的程序有问题。
使用函数 fclose()
后出现错误:
"* Error in `./server': corrupted double-linked list: 0x000000000251a230 * Przerwane (zrzut pamięci)"
如果我删除 fclose()
功能,一切都很好。
这是我的功能代码:
FILE *fHandler;
struct udp_message **returnArray;
struct udp_message *message;
char *line = NULL;
uint32_t linesNum;
uint32_t i = 0;
size_t length;
ssize_t read;
fHandler = fopen(filePath, "r");
if (fHandler == NULL) {
perror("ERROR");
return NULL;
}
returnArray = malloc(sizeof(struct udp_message *)*CONSOLE_BUFFER);
message = malloc(sizeof(struct udp_message));
while ((read = getline(&line, &length, fHandler)) != -1) {
message = (struct udp_message *)line;
if (message->messageTime < aboveTime) {
continue;
}
returnArray[i] = malloc(sizeof(struct udp_message));
memcpy(returnArray[i++], message, sizeof(struct udp_message));
}
memcpy(messageNum, &i, sizeof(i));
fclose(fHandler);
return returnArray;
可能值得检查对象是否为空
if(fHandler != NULL)
fclose(fHandler);
您不太可能使用 getline
读取二进制 UDP 消息。 while
循环有可能迭代超过 CONSOLE_BUFFER
次并且您写入超出 returnArray
的末尾,从而破坏堆内部结构。 fclose()
释放与流关联的缓冲区,free
由于堆损坏而崩溃。
顺便说一下,memcpy(messageNum, &i, sizeof(i));
可能是不正确的。您没有 post 函数原型,但您应该使用 *messageNum = i;
设置存储在 returnArray
中的消息数,特别是如果类型不是 uint32_t *
.
查看你的这部分代码-
message = malloc(sizeof(struct udp_message)); /* <--- 1 */
while ((read = getline(&line, &length, fHandler)) != -1) {
message = (struct udp_message *)line; /* <--- 2. */
if (message->messageTime < aboveTime) {
continue;
}
您将内存分配给 message
(请参阅第 1.
点),但随后在 while
循环中您将其指向 line
(第 2.
点) ).
因此您丢失了对先前分配的内存的引用(并且这两个指针都指向相同的内存位置),因此如果您 free
它们,它将free
相同的内存导致双 free
相同的内存位置。
所以,如果你想让message
指向line
,那就不要给message
分配内存。