温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

c语言中的指针和内存泄漏实例分析

发布时间:2022-02-28 16:36:19 来源:亿速云 阅读:129 作者:iii 栏目:开发技术

这篇文章主要介绍“c语言中的指针和内存泄漏实例分析”,在日常操作中,相信很多人在c语言中的指针和内存泄漏实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c语言中的指针和内存泄漏实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

会出什么问题?

在构建完成后,可能会出现多种有问题的场景,这些场景可能会导致问题。在使用指针时,你可以使用本文中的信息来避免许多问题。

未初始化的内存

在这个例子2中,p已经分配了 10 个字节。这 10 个字节可能包含垃圾数据,如图 1所示。

char ∗p = malloc ( 10 );

如果一个代码段p在一个值被分配给它之前试图访问它,它可能会得到那个垃圾值,你的程序可能会表现得很神秘。p可能具有您的程序从未预料到的值。

一个好的做法是始终使用memsetwithmalloc或始终使用calloc

char ∗p = malloc (10);
memset(p,’\0’,10);

现在,即使相同的代码段p在一个值被分配给它之前尝试访问,并且它对Null值进行了正确的处理(理想情况下应该是这样),那么它的行为也会正常。

内存覆盖

由于p已经分配了 10 个字节,如果某个代码片段试图将一个值写入p11 个字节,那么该操作将在不告诉你的情况下悄悄地从其他位置吃掉一个字节。让我们假设指针q代表这个内存。

结果,指针q将包含从未预料到的内容。即使你的模块编码良好,它也可能由于共存模块执行一些内存覆盖而导致行为不正确。下面的示例代码片段也可以解释这种情况。

char ∗name = (char ∗) malloc(11); 
// Assign some value to name
memcpy ( p,name,11); // Problem begins here

在此示例中,memcpy操作试图将 11 个字节写入p,而它仅分配了 10 个字节。

一个好的做法是,每当向指针写入值时,请确保交叉检查可用字节数和正在写入的字节数。通常,该memcpy函数将是一个检查点。

内存溢出

内存过读是指正在读取的字节数超过预期的字节数。这不是太严重,所以我不会详述。下面的代码给出了一个例子。

char ∗ptr = (char ∗)malloc(10);
char name[20] ;
memcpy ( name,ptr,20); // Problem begins here

在这个例子中,memcpy操作试图从 中读取 20 个字节ptr,但它只分配了 10 个字节。这也将导致不希望的输出。

内存泄漏

内存泄漏真的很烦人。下面的列表描述了一些导致内存泄漏的场景。

  • 重新分配 我将用一个例子来解释重新分配。

char ∗memoryArea = malloc(10); char ∗newArea = malloc(10);

展示更多这将值分配给下面图 4中所示的内存位置。

memoryArea并且newArea每个都分配了10个字节,它们各自的内容如图4所示。如果有人执行如下所示的语句(指针重新分配)

memoryArea = newArea;

那么它肯定会让你在这个模块开发的后期阶段陷入困境。在上面的代码语句中,开发人员已经将memoryArea指针分配给了newArea指针。结果,memoryArea之前指向的内存位置变成了孤立的,如下面的图 5所示。它不能被释放,因为没有对这个位置的引用。这将导致 10 个字节的内存泄漏。图 5. 内存泄漏

 在分配指针之前,请确保内存位置不会成为孤立的。

  • 首先释放父块 假设有一个指向memoryArea10 字节内存位置的指针。该内存位置的第三个字节进一步指向其他一些动态分配的 10 字节内存位置,如图 6所示。

free(memoryArea)

如果memoryArea通过调用 free 被释放,那么newArea指针也将变为无效。newArea无法释放所指向的内存位置,因为没有指向该位置的指针。换句话说,指向的内存位置newArea成为孤儿并导致内存泄漏。每当释放结构化元素时,它又包含指向动态分配的内存位置的指针,首先遍历子内存位置(newArea在示例中)并从那里开始释放,遍历回父节点。这里的正确实现将是:

free( memoryArea‑>newArea);
free(memoryArea);
  • 返回值处理不当有时,某些函数返回对动态分配内存的引用。calling跟踪此内存位置并正确处理它成为函数的责任。

char ∗func ( )
{
        return malloc(20); // make sure to memset this location to â€˜\0’…
}

void callingFunc ( )
{
        func ( ); // Problem lies here
}

在上面的例子中,func()函数内部对callingFunc()函数的调用并没有处理内存位置的返回地址。结果,该func()函数分配的 20 字节块丢失并导致内存泄漏。

回馈你所获得的

在开发组件时,可能会有很多动态内存分配。你可能忘记跟踪所有指针(指向这些内存位置),并且某些内存段没有被释放并一直分配给程序。

始终跟踪所有内存分配,并在适当的时候释放它们。事实上,可以开发一种机制来跟踪这些分配,例如在链接列表节点本身中保留一个计数器(但你还必须考虑这种机制的额外开销!)。

访问空指针

访问空指针非常危险,因为它可能会你的程序崩溃。始终确保你没有访问空指针。

到此,关于“c语言中的指针和内存泄漏实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI