假设我们有一个结构体:
而主要功能是:
struct Person {
char *name;
};
struct Person *Person_create(char *name){
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
return who;
}
void Person_destroy(struct Person *who){
assert(who != NULL);
free(who->name);
free(who);
}
而主要功能是:
int main(int argc,char *argv[]){
struct Person *mike = Person_create("mike");
Person_print(mike);
Person_destroy(mike);
return 0;
}
如果没有strdup()函数,上述代码将无法正常工作。Valgrind会提示你尝试使用free(who->name)释放的地址不是malloc'd。这背后的故事是什么?当我malloc结构体时,我难道没有malloc那块内存吗?而strdup()有什么区别?
Person_print
做了一些不好的写入操作,但我不太相信这个可能性;要么你的程序与这个测试用例不同。 - ouahstrdup
并保留free
,则会遇到一些麻烦。free
仅存在是因为strdup
调用malloc
来复制字符串。 - ouah