调用memset和freeaddrinfo出现double free或内存损坏错误如何解决
错误根源
- 你最初的代码给
freeaddrinfo传入了栈上分配的&hints地址,freeaddrinfo只能释放getaddrinfo动态分配的addrinfo链表内存,对栈地址执行堆释放操作会直接破坏内存结构,触发程序崩溃。你注释掉freeaddrinfo后非法操作消失,程序自然可以正常运行,gdb定位到memset只是堆破坏报错的延迟指向,memset本身没有任何问题。 - 你后续修改参数时出现的
double free or corruption报错,本质是你修改代码时没有正确替换freeaddrinfo的入参,或是没有判断getaddrinfo的返回值:如果getaddrinfo调用失败,servinfo指针未被初始化,直接传入freeaddrinfo也会触发非法内存访问。
修正后的可运行代码
#include <iostream> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int main(){ struct addrinfo hints, *servinfo; int ret; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // 增加返回值判断,调用成功才执行后续操作 if ((ret = getaddrinfo(NULL, "1560", &hints, &servinfo)) != 0) { std::cerr << "getaddrinfo调用失败:" << gai_strerror(ret) << std::endl; return 1; } // 传入getaddrinfo输出的servinfo指针 freeaddrinfo(servinfo); return 0; }
开发规范提示
- 系统调用必须做返回值校验,避免错误状态下的非法指针操作
- 内存释放接口只能释放对应分配接口返回的堆内存地址,禁止传入栈内存、静态内存地址,也禁止重复释放同一内存块。
内容的提问来源于stack exchange,提问作者HPSmash77
相关产品推荐
相关产品推荐

