2012-01-21 336 views
0
for(k=i; k<MAXRECORDS; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
     slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
    } else slist->servers_ptr[k] = NULL; 
} 

当我跑Valgrind的,我得到无效的大小为8内存泄漏

的错误我想这已经是与边界情况在我的for循环,但我不”从逻辑上理解它是如何发生的。

编辑:有人指出,在for循环的最后一轮,访问servers_ptr [k + 1]是数组之外,导致valgrind错误。我已经更新我的代码:

for(k=i; k<MAXRECORDS-1; k++) { 
     if(slist->servers_ptr[k+1] != NULL) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
       if(k==MAXRECORDS-2)slist->servers_ptr[k+1] = NULL; 
     } else slist->servers_ptr[k] = NULL; 
} 

我仍然在valgrind中得到错误。我错误地更新了吗?

+0

MAXRECORDS = 10,并且slist-> servers_ptr []的大小是MAXRECORDS –

+0

这不是内存泄漏,Valgrind消息告诉您正在覆盖或超出分配内存的边界(在您的情况数组中) –

+0

Did你声明'servers_ptr'为'servers_ptr [MAXRECORDS + 1]'?否则,当'k = MAXRECORDS-1'时,您正在读取结尾。 –

回答

3

这几乎肯定是因为你超越了数组的末尾。 k的最大值是MAXRECORDS-1,您在表达式中使用的是k+1

这意味着您将访问array[MAXRECORDS]索引应限制在0MAXRECORDS - 1(含)之间。

这是很难看到你想要什么没有更多的情况下做的,但如使用k < MAXRECORDS - 1作为for循环持续的条件(在中间位)修复可以是简单:

for (k = i; k < MAXRECORDS - 1; k++) { 

其他可能性是i的无效值,例如-1,这会导致阵列另一端出现问题。这可能不太可能,因为我假设您通过将所有其他元素向下移动来删除元素i(如:i将设置为有效索引)。


这不是一个内存顺便说一下,一个简单的内存损坏泄漏。内存泄漏是当你分配内存,然后失去了指向他们,让他们永远不能被释放,是这样的:

char *x; 
for (i = 0; i < 10; i++) 
    x = malloc (64); 

,其中仅最后分配访问。


顺便说一句,如果一个洗牌的缺失是你以后,它会做得更好(在我看来)为:

// For every element where there's a non-NULL next element, 
// shift that element down. Then force the last element to 
// be NULL (it will have been shifted down already). 

for (k = i; (k < MAXRECORDS - 1) && (slist->servers_ptr[k+1] != NULL); k++) 
    slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
slist->servers_ptr[k] = NULL; 

额外的条件停止下一个元素NULL并将NULL置于该位置。这应该可以正常工作,并且具有不那么复杂的优点。

+0

这是更清洁,你是对的。好的解释,我会给这个镜头。 –

2

基础上for条件下,这看起来像一个错误:

if((slist->servers_ptr[k+1] != NULL) 

,因为它会读取过去servers_ptr数组的结尾。

将条件更改为k < MAXRECORDS - 1

+0

谢谢:))我改变了for循环的条件,但我仍然得到错误:( –

3

如果slist->servers_ptr是大小为MAXRECORDS的数组,则当k = MAXRECORDS - 1时访问元件k+1将超出数组边界。

由于0是数组的第一个元素,因此10是数组的元素。大小为10的数组没有第十一个元素。

+0

这是有道理的。谢谢! 我更新了for循环的界限,但仍然在valgrind中得到相同的问题。 –