C语言 向量中的Valgrind内存泄漏 您所在的位置:网站首页 vector内存泄漏 C语言 向量中的Valgrind内存泄漏

C语言 向量中的Valgrind内存泄漏

2023-03-04 15:05| 来源: 网络整理| 查看: 265

**编辑:**在发布第1部分后,我发现了另一个更可能的内存泄漏。第1部分仍然相关,但可能先阅读第2部分。第一部分:

张贴的代码是不完整的,所以不可能完全检查代码,但这里有一个潜在的问题。如果realloc失败,使用realloc可能会导致内存泄漏。当realloc无法分配所请求的内存时,它返回NULL并保持原始内存不变,其中包括“仍已分配”。因此,使用realloc的安全方法是:

void * tmp = realloc(ptr, size); if (tmp != NULL) { ptr = tmp; } else { // Error handler.... }

在代码后面的某个地方d 0x 1 m4n1x发布的代码有一个数字realloc,它将返回值直接保存到原始指针中,例如

v->data[i-1] = realloc(v->data[i-1], strlen(v->data[i])+1);

这可能会导致内存泄漏,除非您知道在调用realloc时v->data[i-1]为NULL。但是,如果您知道这一点,则应该使用malloc,以使代码更清楚。在此代码块中:

char **tmp = v->data; // Reallocate memory for the array v->capacity *= VECT_GROWTH_FACTOR; v->data = (char**) realloc(tmp, (v->capacity) * sizeof(*v->data)); if (v->data == NULL) { return; }

您似乎尝试使用realloc的tmp指针。但这是错误的方法。返回值存储到v->data中,如果为NULL,则函数返回而不释放tmp。这又是一个潜在的内存泄漏。您是否打算执行if (v->data == NULL) { free(tmp); return; }除此之外,在这种情况下使用return似乎是错误的。稍后执行的代码可能会取消引用NULL指针并崩溃。也许您需要exit(FAILURE)而不是return

第二部分:

快速浏览vect_remove_first让我产生了怀疑...移除元素的函数怎么可能没有调用free呢?看起来像是漏洞导致的。而且是...如果向量已满,即data中的所有指针都为非空,则需要在最后一个元素上调用free。此外,对于“完整”向量,当执行v->data[i] = NULL;时,您确实会访问边界,因为i将等于v->size也就是说......为什么要做那些realloc和strcpy呢?这太复杂太慢了。而且你不需要它!你有一个指针数组,所以你可以移动指针值。原则上如下:

free(v->data[0]); v->data[0] = v->data[1]; v->data[1] = v->data[2]; ... v->data[v->size - 2] = v->data[v->size - 1]; v->data[v->size - 1] = NULL;

真实的的实现可能是一个循环或者memmove。使用memmove,代码将非常简单,但是当填充水平较低时,性能很可能会更差。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有