我在自己的 substr 函数中遇到内存泄漏错误
I'm getting a memory leak error in my own substr function
char *ft_substr(char const *s, unsigned int start, size_t len)
{
size_t i;
size_t d;
char *subs;
i = 0;
d = 0;
subs = (char *)malloc(sizeof(char) * (len + 1));
if (!subs || !s)
{
return NULL;
}
while (s[i])
{
if (i >= start && d < len)
{
subs[d] = s[i];
d++;
}
i++;
}
subs[d] = '[=10=]';
return subs;
}
上面出现的代码是我写的substr函数,当我使用Memd检查内存泄漏时,我发现第14行有错误
subs = (char *)malloc(sizeof(char) * (len + 1));
不幸的是,我没有权限在我使用的设备上安装 Valgrind,所以我可以用 memd 进行测试。我是 C 语言的新手,您能解释一下为什么我会遇到内存泄漏错误以及如何修复它吗?
subs = (char *)malloc(sizeof(char) * (len + 1));
if (!subs || !s)
{
return (NULL);
}
我if语句的sub-statement会在s等于NULL的时候拿到控制权,这时会出现内存泄露
注意,您可以像所有C标准字符串函数一样,去掉检查s是否为空指针。如果用户将调用传递空指针的函数,则会出现未定义的行为。
并且 malloc 的调用可以分配比需要更多的内存。
还有第二个和第三个参数的类型不一致
char *ft_substr(char const *s, unsigned int start, size_t len)
两者都应具有类型 size_t
。
解决这个问题的关键是在你的函数的开头添加一个守卫,在你分配给 subs
之前,它可能永远不会是 returned,因此无法被释放。
if (!s) return NULL;
您仍然可以稍后检查 subs
何时分配,如果分配失败 return NULL
。
如果你想让它安全,你不仅需要检查 s
是否不为 NULL,而且还需要检查开始是否超过字符串的长度。
尝试只从函数中获得一个 return 点,而不是使用肯定检查(即,如果某些东西有效,而不是检查它是否无效)。
char *ft_substr(char const * restrict s, const size_t start, const size_t length)
{
char *subs = NULL;
if(s)
{
size_t len = strlen(s);
if(len >= start)
{
subs = malloc(length + 1);
if(subs)
{
char *wrk = subs;
size_t tocopy = length;
s += start;
while(tocopy-- && (*wrk++ = *s++));
*wrk = 0;
}
}
}
return subs;
}
char *ft_substr(char const *s, unsigned int start, size_t len)
{
size_t i;
size_t d;
char *subs;
i = 0;
d = 0;
subs = (char *)malloc(sizeof(char) * (len + 1));
if (!subs || !s)
{
return NULL;
}
while (s[i])
{
if (i >= start && d < len)
{
subs[d] = s[i];
d++;
}
i++;
}
subs[d] = '[=10=]';
return subs;
}
上面出现的代码是我写的substr函数,当我使用Memd检查内存泄漏时,我发现第14行有错误
subs = (char *)malloc(sizeof(char) * (len + 1));
不幸的是,我没有权限在我使用的设备上安装 Valgrind,所以我可以用 memd 进行测试。我是 C 语言的新手,您能解释一下为什么我会遇到内存泄漏错误以及如何修复它吗?
subs = (char *)malloc(sizeof(char) * (len + 1));
if (!subs || !s)
{
return (NULL);
}
我if语句的sub-statement会在s等于NULL的时候拿到控制权,这时会出现内存泄露
注意,您可以像所有C标准字符串函数一样,去掉检查s是否为空指针。如果用户将调用传递空指针的函数,则会出现未定义的行为。
并且 malloc 的调用可以分配比需要更多的内存。
还有第二个和第三个参数的类型不一致
char *ft_substr(char const *s, unsigned int start, size_t len)
两者都应具有类型 size_t
。
解决这个问题的关键是在你的函数的开头添加一个守卫,在你分配给 subs
之前,它可能永远不会是 returned,因此无法被释放。
if (!s) return NULL;
您仍然可以稍后检查 subs
何时分配,如果分配失败 return NULL
。
如果你想让它安全,你不仅需要检查 s
是否不为 NULL,而且还需要检查开始是否超过字符串的长度。
尝试只从函数中获得一个 return 点,而不是使用肯定检查(即,如果某些东西有效,而不是检查它是否无效)。
char *ft_substr(char const * restrict s, const size_t start, const size_t length)
{
char *subs = NULL;
if(s)
{
size_t len = strlen(s);
if(len >= start)
{
subs = malloc(length + 1);
if(subs)
{
char *wrk = subs;
size_t tocopy = length;
s += start;
while(tocopy-- && (*wrk++ = *s++));
*wrk = 0;
}
}
}
return subs;
}