我被告知要写一个包装器,它取一个位置和编号的起始地址' n'为了大小。之后,使用此内存来存储内容。 我能够编写代码,但程序中存在内存泄漏。 这是该计划:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int alloc_func(char *newptr, int size)
{
newptr = (char *)realloc(newptr, size);
printf("In func: %p\n", newptr);
if(NULL == newptr)
return 0;
else
return 1;
}
int main(int argc, char **argv)
{
char *foo = "Computer"; //string to be copied to newly allocated memory
char *ptr = (char *)malloc(1*sizeof(char));
printf("Before return: %p\n", ptr);
int size = 10, flag;
flag = alloc_func(ptr, size);
printf("After return: %p\n", ptr);
if(flag == 0)
return EXIT_FAILURE;
else{
strcpy(ptr, foo);
}
printf("The copied string is: %s\n", ptr);
free(ptr);
return 0;
}
在运行valgrind时,泄漏摘要说 &#34;绝对丢失:1个区块中的10个字节&#34;
这种情况正在发生,因为我将ptr(起始地址)作为指针值发送给函数,因此该函数正在创建指针的副本,即程序中的newptr。这个newptr正在重新分配到10个位置。由于我没有返回newptr,一旦该功能结束,我的“realloc”&#39; ed&#39;地点将超出范围并丢失。
我怀疑是:
a)即使创建了指针的副本,ptr和newptr也将指向同一个内存位置,那为什么会泄漏呢?
b)没有malloc&#39;变量&#39;全球&#39; ?
c)是否发生了泄漏,因为我没有传递指针的地址,因此不会创建副本? (我试过这个,但我想知道为什么)
d)在我的主要内容中,什么是免费的(ptr在做什么)?只需清除ptr malloc为1?
e)有没有办法检查那个10&#39;字节的分配是否成功?
答案 0 :(得分:5)
你的alloc_func()方法应该是:
int alloc_func(char **newptr, int size)
{
char *p = (char *)realloc(*newptr, size);
printf("In func: %p\n", p);
if(NULL == p) {
return 0;
} else {
*newptr = p;
return 1;
}
然后用
来调用它flag = alloc_func(&ptr, size);
那样ptr会改变。
答案 1 :(得分:1)
您要更改newptr
中alloc_func
的值。但是,这只是一个局部的变化。它不会更改调用函数中指针的值。因此,您有一个悬空指针和内存泄漏。
调用函数有一个悬空指针
alloc_func
有内存泄漏。
您需要将新分配的指针从alloc_func
返回到调用函数。您可以通过返回的值或通过将参数更改为指针指针来执行此操作。
解决方案1:返回指针
char* alloc_func(char *newptr, int size)
{
newptr = (char *)realloc(newptr, size);
printf("In func: %p\n", newptr);
return newptr;
}
并将main
中的通话更改为:
ptr = alloc_func(ptr, size); // not flag = ...
解决方案2:更改参数类型
int alloc_func(char **newptr, int size)
{
*newptr = (char *)realloc(*newptr, size);
printf("In func: %p\n", *newptr);
if(NULL == *newptr)
return 0;
else
return 1;
}
并将main
中的通话更改为:
flag = alloc_func(&ptr, size); // Use &ptr, not ptr