发生内存泄漏;如何释放这个 malloc?
Got memory leak; how to free this malloc?
bool check(const char *word)
{
int length = strlen(word);
//malloc size of char times length of word plus [=10=]
char *lower_case = malloc(sizeof(char) * (length + 1));
lower_case[length + 1] = '[=10=]';
//change characters to lowercase
for (int i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
//generate int hash
int index = generate_hash(lower_case);
node_ptr trav = hashtable[index];
while (trav != NULL)
{
if (strcmp(trav->word, lower_case) == 0)
{
return true;
}
trav = trav -> next;
}
free(lower_case);
return false;
}
我从 Valgrind 测试中泄漏了 27 个字节的内存;如何释放它?
malloc
之后立即出现越界访问。
此处,您正在越界访问:
lower_case[length + 1] = '[=10=]';
应该是:
lower_case[length] = '[=11=]';
检查 malloc
是否也失败了也是一个明智的想法!
如评论中所述,还有一种情况是从循环内部返回时会发生内存泄漏。你需要在那里释放:
if (strcmp(trav->word, lower_case) == 0)
{
free(lower_case);
return true;
}
lower_case[length + 1] = '[=11=]';
写越界,改成[length]
.
- 您缺少
#include <stdlib.h>
和其他必要的内容。
- 每次执行
return true;
. 都会造成内存泄漏
- 永远不要将指针隐藏在 typedef 后面,正如 CS-50 中废话 类 所教导的那样。
您应该能够按照以下方式修复代码:
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
bool check (const char *word)
{
size_t length = strlen(word);
char* lower_case = malloc(length + 1);
if(lower_case == NULL)
{
return false;
}
//change characters to lowercase
for (size_t i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
lower_case[length] = '[=10=]';
//generate int hash
int index = generate_hash(lower_case);
bool result = false;
for(const node* trav = hashtable[index]; trav!=NULL; trav=trav->next)
{
if (strcmp(trav->word, lower_case) == 0)
{
result = true;
break;
}
}
free(lower_case);
return result;
}
类型node_ptr
需要改为node
没有隐藏指针。
bool check(const char *word)
{
int length = strlen(word);
//malloc size of char times length of word plus [=10=]
char *lower_case = malloc(sizeof(char) * (length + 1));
lower_case[length + 1] = '[=10=]';
//change characters to lowercase
for (int i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
//generate int hash
int index = generate_hash(lower_case);
node_ptr trav = hashtable[index];
while (trav != NULL)
{
if (strcmp(trav->word, lower_case) == 0)
{
return true;
}
trav = trav -> next;
}
free(lower_case);
return false;
}
我从 Valgrind 测试中泄漏了 27 个字节的内存;如何释放它?
malloc
之后立即出现越界访问。
此处,您正在越界访问:
lower_case[length + 1] = '[=10=]';
应该是:
lower_case[length] = '[=11=]';
检查 malloc
是否也失败了也是一个明智的想法!
如评论中所述,还有一种情况是从循环内部返回时会发生内存泄漏。你需要在那里释放:
if (strcmp(trav->word, lower_case) == 0)
{
free(lower_case);
return true;
}
lower_case[length + 1] = '[=11=]';
写越界,改成[length]
.- 您缺少
#include <stdlib.h>
和其他必要的内容。 - 每次执行
return true;
. 都会造成内存泄漏
- 永远不要将指针隐藏在 typedef 后面,正如 CS-50 中废话 类 所教导的那样。
您应该能够按照以下方式修复代码:
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
bool check (const char *word)
{
size_t length = strlen(word);
char* lower_case = malloc(length + 1);
if(lower_case == NULL)
{
return false;
}
//change characters to lowercase
for (size_t i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
lower_case[length] = '[=10=]';
//generate int hash
int index = generate_hash(lower_case);
bool result = false;
for(const node* trav = hashtable[index]; trav!=NULL; trav=trav->next)
{
if (strcmp(trav->word, lower_case) == 0)
{
result = true;
break;
}
}
free(lower_case);
return result;
}
类型node_ptr
需要改为node
没有隐藏指针。