当前位置:首页 > 内存 > 正文

常见的内存泄漏有哪些(win10内存泄漏如何解决)

  • 内存
  • 2024-07-04 10:49:21
  • 159

一、C语言中的指针和内存泄漏对于任何使用C的人来说,如果你问他们C有什么问题,他们中的许多人可能会回答指针和内存泄漏。这些确实是消耗开发人员大部分调试时间的事情。指针和内存泄漏对于某些开发人员来说似乎令人生畏,但是一旦您了解了指针及其相关内存操作的基础知识,它们就会成为C语言中的绝佳工具。
本文将与您分享其中的秘密开发人员在开始使用指针编程之前需要了解这一点。本文内容包括:
导致内存损坏的指针操作类型
使用动态内存分配时要考虑的检查点
导致内存泄漏的场景
如果预先知道会出现什么问题,您可以仔细避免陷阱并消除大多数与指针和内存相关的问题。
可能会出现什么问题?
构建完成后,可能会出现多种可能导致问题的情况。您可以使用本文中的信息来避免处理指针时的许多问题。
未初始化内存
在此示例中,p分配了10个字节。这10个字节可能包含垃圾数据,如图1所示。
char*p=malloc(10);
图1.垃圾数据
如果在给p赋值之前,某个代码段尝试访问它,你可能会得到垃圾值,你的程序可能会出现不可预测的行为。p可能具有您的程序从未预料到的值。
好的做法是始终将memset与malloc结合使用,或使用calloc。
char*p=malloc(10);
memset(p,'\0',10);
现在,即使相同的代码段尝试通过在分配p之前访问p,此代码片段还将正确处理Null值(理想情况下它应该具有),然后具有正确的行为。
内存重置
由于p已经分配了10个字节,如果一段代码试图向p写入一个11字节的值,该操作将自动“吃掉”a字节。来自另一个国家而不告诉你。让我们假设指针q代表这个内存。
图2.q原来的内容
图3.覆盖后的q内容
这样,指针q就有内容了这是从未预料到的。即使您的模块编码良好,它也可能由于共存模块执行的某些内存操作而出现行为异常。下面的示例代码片段也说明了这种情况。
char*name=(char*)malloc(11);
//为name分配一些值
memcpy(p,name,11);//问题就在这里
作为一个好习惯,每当向指针写入值时,请务必检查可用字节数和写入的字节数。通常,memcpy函数将是用于此目的的检查点。
内存读取越界
内存读取越界(overread)意味着读取的字节数超出了需要的数量。这个问题并不是很严重,这里就不详细讨论了。下面的代码提供了一个示例。
char*ptr=(char*)malloc(10);
charname[20];
memcpy(name,ptr,20);//问题就在这里
在此示例中,memcpy操作尝试从ptr读取20个字节,但后者仅分配了10个字节。这也可能导致不良结果。


二、求助大神,关于win10笔记本连接外置显示器内存泄漏的问题您可以放心,切换显示不会影响内存使用。
如果内存使用量持续增加,可以使用进程管理器和资源监视器来检查哪些进程使用了​​过多的内存并进行详细处理。不合理的内存消耗通常是由于软件安装编写不当造成的。