首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放char数组时发生内存泄漏

释放char数组时发生内存泄漏
EN

Stack Overflow用户
提问于 2013-07-02 11:46:37
回答 2查看 201关注 0票数 2

我让malloc一个char数组并初始化它:

代码语言:javascript
复制
int i;
int length = 100;
char *arr = (char *) malloc (length * sizeof(char));
for (i = 0; i < length; i++) {
    arr[i] = i;
}

然后我将中间的字符设置为'\0':

代码语言:javascript
复制
arr[50] = '\0';

在这种情况下,arr只有无效的长度为50,而不是100,那么我使用free:

代码语言:javascript
复制
free(arr);

这会导致内存泄漏吗?也就是说,操作系统会记录malloc的长度,还是只使用strlen来判断长度?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-02 11:51:07

不是的。内存的内容对free()的工作方式没有影响。

free()不知道您将其用作以null结尾的字符串。它永远不会在一块内存上使用strlen()

尝试使用valgrind之类的工具来检查您的代码是否存在漏洞。

票数 1
EN

Stack Overflow用户

发布于 2013-07-02 11:58:23

free知道分配的内存块的大小。它是怎么知道大小的?这取决于实现,但通常情况下,它会在分配的实际内存块开始之前存储大小。例如,在Coliru上,下面的程序打印113 (113表示它分配的内存比我们实际请求的内存多)。

代码语言:javascript
复制
#include <iostream>

int main()
{
 char *arr = (char *) malloc (100 * sizeof(char));
 std::cout << *((std::size_t*)arr - 1) << std::endl;
}

这是非常过时的,但阅读A Memory Allocator可能是一个好主意。它将让您了解正在进行的更好的操作(只需记住,可能与实际实现有所不同)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17417076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档