我有一个创建字符串的函数。这是一个简单的例子:
char* getString() {
char *buffer = (char*)malloc(20 * sizeof(char));
snprintf(buffer, 20, "Some stupid text");
return buffer;
}
这是主要功能:
int main() {
printf("%s\n", getString());
return 0;
}
此代码中是否发生内存泄漏(因为Valgrind没有警告任何内存泄漏)?如果是,如何在主函数中不使用新变量的情况下避免这种情况?
由于
答案 0 :(得分:3)
是,不,你有内存泄漏。是的,您没有显式删除getString函数中分配的缓冲区。不,因为这个泄漏是在main()内发生而没有循环,所以当main()退出时,你的缓冲区会被释放。
所以,虽然你所做的是糟糕的编码实践,但在这种特殊情况下它并没有造成任何伤害。
你需要在main中有一些变量来解决这个问题。
答案 1 :(得分:0)
是的,你肯定有泄密。
这是正确的:
char* getString() {
char *buffer = malloc(20 * sizeof(char));
snprintf(buffer, 20, "Some stupid text");
return buffer;
}
int main() {
char *mystring = getString();
printf("%s\n", mystring);
free(mystring);
return 0;
}
但是你的程序valgrind应该显示有泄漏。
答案 2 :(得分:0)
是的,你有泄漏。当你只调用getstring而不将它放在变量中时,你就丢失了指向缓冲区的指针。
当您丢失指向变量的指针时(即当您丢失变量的“路径”)时会发生泄漏