linux无效内存访问,在Linux下使用用Valgrind查找内存泄漏和无效内存访问

Valgrind还能发现什么?

Valgrind还能发现其它不正确使用内存的错误:如果你对同一块内存释放了两次,Valgrind就会探测到,而你则得到非法free的调用栈信息。

Valgrind 也能检测到使用不正确方法释放内存的错误。比如,在C++语言中有三种基本的内存释放方法:free,delete和delete[]。free函数应该仅与malloc函数相对应--在一些系统上,你可能无须面对这个问题,但这样不具备可移植性。delete[]应该又只能和new[](分配数组)相对应。(也许有些编译器允许你不去理会这些规则,但不能保证所有的编译器都允许你这样做,毕竟它不是标准的一部分。)

如果程序中存在这些问题,你会得到下列错误信息:

Mismatched free() / delete / delete []

这些错误都应该被立刻修复,即使你的程序偶然能够正常运行。

Valgrind不能查出哪些错误?

Valgrind不对静态数组(分配在栈上)进行边界检查。如果在程序中声明了一个数组:

int main()

{

char x[10];

x[11] = ′a′;

}

Valgrind则不会警告你!出于测试目的,你可以把数组改为动态在堆上分配的数组,这样就可能进行边界检查了。这个方法好像有点得不偿失的感觉。

更多告诫

使用Valgrind的负面影响是什么?它占用了更多的内存--可达两倍于你程序的正常使用量。如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试。大多数情况下,这都不是问题,即使速度慢也仅是检测时速度慢,如果你用Valgrind来检测一个正常运行时速度就很慢的程序,这下问题就大了。

Valgrind不可能检测出你在程序中犯下的所有错误--如果你不检查缓冲区溢出,Valgrind也不会告诉你代码写了它不应该写的内存。

总结

Valgrind是x86架构上的工具,只能在Linux上运行(FreeBSD和NetBSD上的相关版本正在开发中)。它允许程序员在它的环境里测试程序以检测未配对malloc调用错误和其它使用非法内存(未初始化内存)的错误以及非法内存操作(比如同一块内存释放两次或调用不正确的析构函数)。 Valgrind不检查静态分配数组的使用情况。0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值