vin*_*win 2 c memory valgrind pointers memory-leaks
我被告知写一个包装器,它取一个位置的起始地址和数字'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;
Run Code Online (Sandbox Code Playgroud)
}
在运行valgrind时,泄漏摘要说"绝对丢失:1个块中的10个字节"
发生这种情况是因为我将ptr(起始地址)作为指针值发送到函数,因此函数正在创建指针的副本,即程序中的newptr.这个newptr正在重新分配到10个位置.由于我没有返回newptr,一旦函数结束,我的'realloc'ed'位置将超出范围并丢失.
我的疑问是:
a)即使创建了指针的副本,ptr和newptr也将指向同一个内存位置,那为什么会泄漏呢?
b)malloc'ed变量不是'全球'吗?
c)是否发生了泄漏,因为我没有传递指针的地址,因此不会创建副本?(我试过这个,但我想知道为什么)
d)在我的主要内容中,什么是免费的(ptr在做什么)?刚刚清理ptr malloc'ed为1?
e)有没有办法检查那10个"大小"字节的分配是否成功?
你的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;
}
Run Code Online (Sandbox Code Playgroud)
你打电话给它
flag = alloc_func(&ptr, size);
Run Code Online (Sandbox Code Playgroud)
那样ptr会改变.