c++ 系统内存检查(Linux)

c++ 系统内存检查(Linux)

检查内存泄露

通过g++来检查内存泄露的问题

# g++
g++ -fsanitize=address -g -o testmen testmem.cpp
# CMakeLists.txt 里面添加
set(CMAKE_CXX_FLAGS "-fsanitize=address")

使用-fsanitize=address开关以后,代码不用做任何改动,就自动具有报告内存泄漏的能力

// 示例代码
#include <stdlib.h>
#include <iostream>
#include <string.h>

using namespace std;

void new_test()
{
	int *test = new int[80];
}
void malloc_test()
{
	int *test =(int*) malloc(100);
}

int main()
{
    cout << "memory test" << endl;
	malloc_test();
	cout << "malloc test end" << endl;

	new_test();
	cout << "new test end" << endl;

	return 0;
}

gcc 4.8以上的版本内嵌有该功能,如果在编译链接时出现错误提示:“/usr/bin/ld:找不到/usr/lib64/libasan.so.5.0.0”,则需要安装libasan

ASan(Address Sanitizer)是一个C/C++内存错误检测器,它可以发现很多内存相关的错误,比如内存泄漏、释放之后再次使用、堆内存溢出、栈溢出等

检查堆溢出

// 示例代码
void heap_buffer_overflow_test()
{
	char *test = new char[10];
	const char* str = "this is a test string";
	strcpy(test,str);
	delete []test;
}

检查栈溢出

// 示例代码
void heap_buffer_overflow_test()
{
	char *test = new char[10];
	const char* str = "this is a test string";
	strcpy(test,str);
	delete []test;
}

检查全局内存溢出

// 示例代码
int global_data[100] = {0};
void global_buffer_overflow_test()
{
	int data = global_data[101];
}

检查释放后继续使用

// 示例代码
void use_after_free_test()
{
	char *test = new char[10];
	strcpy(test,"this test");
	delete []test;
	char c = test[0];
}

注意:
添加了-fsanitize=address选项后,不能再用valgrind -v来查看内存泄露

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值