使用了未初始化的内存a_c专家编程读书笔记 第七章 内存泄漏

动态分配内存的三个函数

  1. malloc:在堆中获取内存
  2. calloc:分配清零后的内存
  3. realloc:改变一个指针所指向的内存块的大小

堆经常会出现两种类型的问题

  • 释放或改写仍在使用的内存(称为“内存损坏”)
  • 未释放不再使用的内存(称为“内存泄漏”)

内存泄漏

内存泄漏定义:一种稀有资源正被一个进程榨干。主要症状就是速度会变慢。

e680959c4b69582194b8f69ace3595b5.png

检测内存泄漏:

  • 1使用swap命令观察还有多少可用的交换空间。在一分钟内键入三四次,如果发现不断有内存被分配且不释放,一个可能的解释是有个进程出现了泄漏。
  • 2确定可疑的进程。可以使用pa -la 用户名命令显示所有进程的大小。数次重复这个命令,如果发现有一个进程不断增加从不减少,他可能出现了内存泄漏。

最简单的内存泄漏形式:

for (i = 0; i<10; i++) p=malloc(1024);
f35899b05340e6616ae3744f8cba5e3a.png

在所有的网络检测工具中,最神奇的莫过于 snoop了

snoop是SVr4中 etherfind的替代品,它从网络中捕捉分组(packet),并在你的工作站上显示。你可以告诉 Snoop只把精力集中于一至两台机器,也就是你自己的工作站和服务器,这对于检测连接故障非常有用—snoop甚至可以告诉你字节数据正从你的机器中发出。

但snoop最好的特性就是它的-a选项。它可以使 snoop让每个分组都在工作站的扬声器中输出一个滴答声,你可以聆听网络的以太交通。不同的分组长度具有不同的调幅,如果你习惯于使用 snoop-a,你会对那些特征声音了如指掌,可以凭借“耳朵”来检测并优化网络。

总线错误和段错误

当硬件告诉操作系统一个有问题的内存引用时,就会出现这两种错误。操作系统通过向出错的进程发送一个信号与之交流。

信号就是一种事件通知或一个软件中断,是由于硬件中断而产生的。

总线错误几乎都是由于未对齐的读或写引起的。因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。

段错误是由于内存管理单元(负责支持虚拟内存的硬件)的异常所致,该异常通常是由于解除引用一个未初始化或非法值的指针引起的。

  • 1坏指针值错误:在指针赋值前就用它来引用内存,或向库函数传送一个坏指针。
  • 2改写错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些管理数据结构。
  • 3指针释放引起的错误:释放同一个内存块两次,释放未使用malloc分配的内存,或释放使用中的内存,或释放一个无效的指针。
16870e71294c7d74d95307b9a9d6b409.png

一 段错误 的爱情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C6001 是 Visual Studio 中的一个静态代码分析器警告编码,它表示使用初始化内存。这种情况经常发生在没有正确初始化变量或者分配内存之前就使用它们的情况下。 这个警告的出现是因为初始化内存可能包含任意的数据,使用这些数据可能导致定义的行为,例如程序崩溃或产生错误的结果。 为了修复这个问题,你需要确保在使用变量或分配内存之前正确地初始化它们。具体的解决方法取决于你的代码。以下是一些常见情况和解决方法: 1. 如果是局部变量,确保在使用之前进行初始化。例如,如果你有一个整型变量 `int x;`,则应该将其初始化为一个合适的值,例如 `int x = 0;` 或者 `int x = someFunction();`。 2. 如果是指针变量,确保在使用之前分配内存,并将其初始化为合适的值。例如,如果你有一个整型指针 `int* p;`,则应该在使用之前为其分配内存,并将其初始化为一个有效的地址,例如 `int* p = new int;` 或者 `int* p = &someVariable;`。 3. 如果是数组,确保在使用之前对其进行初始化。例如,如果你有一个整型数组 `int arr[10];`,则应该在使用之前为其所有元素赋予合适的值,例如使用循环 `for` 或者 `memset` 函数。 请注意,这只是一些常见的解决方法,具体的解决方案还取决于你的代码和使用情况。在修复问题之后,重新编译并再次运行静态代码分析器来确保警告已经消除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值