如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏?

要查找 c++++ 中的内存泄漏,可以利用 valgrind 和 addresssanitizer。valgrind 动态检测泄漏,显示地址、大小和调用栈。addresssanitizer 是一个 clang 编译器插件,检测内存错误和泄漏。要启用 asan 泄漏检查,请在编译时使用 –leak-check=full 选项,该选项将在程序运行后报告泄漏。

如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏?

如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏

引言
内存泄漏是 C++ 等语言中的一个常见问题。为了检测和解决这些泄漏,可以使用像 Valgrind 和 AddressSanitizer 这样的工具。

使用 Valgrind 查找内存泄漏
Valgrind 是一个动态内存调试工具,可以检测内存泄漏。要使用 Valgrind:

立即学习“C++免费学习笔记(深入)”;

valgrind ./my_program

登录后复制

Valgrind 将运行程序并报告任何检测到的内存泄漏。输出将显示泄漏的地址、大小和调用栈。

示例
以下 C++ 代码示例演示了 Valgrind 如何检测内存泄漏:

int* ptr = new int[10];// ...// 忘记释放 ptr

登录后复制登录后复制

运行此代码并使用 Valgrind,将输出以下结果:

==8445== LeakSanitizer: detected memory leaks==8445== Direct leak of 40 bytes in 1 object(s) allocated from:    #0 0x49f2c0 in default_new_allocator_000000157013e0000000 ::operator() () (_libunwind.dylib:0x103d8e000)    #1 0x41626f in create_array () in /tmp/a.out:10    #2 0x415b2d in main () in /tmp/a.out:15SUMMARY:==8445== LEAK SUMMARY:==8445==    definitely lost: 40 bytes in 1 object(s)

登录后复制

输出显示了泄漏了 40 字节,并在地址 0x49f2c0 处分配。

使用 AddressSanitizer 查找内存泄漏
AddressSanitizer (ASan) 是一个 Clang 编译器插件,可以检测内存错误,包括内存泄漏。要使用 ASan:

clang++ -fsanitize=address ...

登录后复制

ASan 将检测内存访问错误,并在发生错误时生成崩溃报告。要检查内存泄漏,请运行程序两次:

./my_program # 第一次运行./my_program --leak-check=full # 第二次运行,启用泄漏检查

登录后复制

第二次运行将报告任何检测到的内存泄漏。

示例
以下 C++ 代码示例演示了 AddressSanitizer 如何检测内存泄漏:

int* ptr = new int[10];// ...// 忘记释放 ptr

登录后复制登录后复制

编译并运行此代码,启用 ASan,将输出以下结果:

==28847== ERROR: AddressSanitizer: detected memory leaks    SUMMARY:    ==28847== LeakSanitizer: 40 byte(s) leaked in 1 allocation(s).    ==28847==    0x7fdd1b000010  40 bytes in 1 block      ==28847== LeakSanitizer:      ==28847==  Direct leak of 40 bytes in 1 object(s) allocated from:      ==28847==    #0 0x7fdd17a346c0 in __sanitizer::Allocator::allocate(unsigned long) (_sanitizer.h:1195)      ==28847==    #1 0x7fdd184d0f90 in void* std::__detail::__shared_count::allocate() (_shared_count.h:128)      ==28847==    #2 0x7fdd182de485 in void* std::__shared_ptr::__clone() (_shared_ptr.h:256)      ==28847==    #3 0x48b935 in create_array() (/tmp/a.out:10)      ==28847==    #4 0x48b884 in main (/tmp/a.out:15)

登录后复制

输出显示了泄漏了 40 字节,并在地址 0x7fdd1b000010 处分配。

以上就是如何使用 Valgrind 或 AddressSanitizer 查找 C++ 中的内存泄漏?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2562894.html

(0)
上一篇 2025年3月6日 09:20:11
下一篇 2025年3月6日 09:20:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 天麻有6种人不能吃

    天麻是生活中比较常见的一种中药材,它可以起到很不错的功效与作用,适量服用有很好的保健效果,深受人们喜欢。天麻虽然有很好的食疗效果,但是不是所有人都适合吃的,比如孕妇儿童、哺乳期、过敏以及发热人群不适合吃。 天麻的禁忌人群 1、血虚 天麻属祛…

    2025年4月26日 用户投稿
    687.4K00
  • 新鲜荔枝一次最好不要超过吃几颗

    荔枝是生活中比较常见的一种水果,它含有多种营养成分,适量食用对身体有一定好处,很多人都喜欢吃荔枝。新鲜荔枝味道清甜可口,但是一次最多不要超过10颗,吃多了就会容易上火,还会容易导致肥胖等,不利于身体健康。 鲜荔枝一天最多吃几个 建议一天吃5…

    2025年4月26日
    105.6K00
  • 桑葚干可以直接嚼着吃吗

    桑葚干是生活中比较常见的一种食物,它是用新鲜的桑葚制作而成的,也含有一定的营养成分,适量食用可以起到一定的保健效果,很多人都会用桑葚干泡水喝。桑葚干是可以直接吃的,但是吸收效果没有泡水喝的效果好。 桑葚干可以直接嚼着吃吗 可以直接吃。 干桑…

    2025年4月26日
    840.1K00
  • 香榧怎么吃才好吃

    香榧是比较特别的一种坚果食品,它的样子和巴旦木比较像,外面会有一层壳,里面是坚果,含有丰富的营养成分,适量食用对身体有一定好处,香榧子的吃法也比较多,可以直接剥壳吃,也可以炒成坚果吃,还可以炸油吃等。 香榧怎么吃 1、先找到香榧一头较尖的部…

    2025年4月26日 用户投稿
    680.5K00
  • 一天吃30几个杨梅会怎么样

    杨梅是夏季比较常见的一种水果,它的果肉鲜嫩多汁,吃起来香甜可口,营养价值高,深受人们喜欢。杨梅虽然好吃,但是一次也不能吃太多,如果一次吃二三十颗,这种算是过多食用的,可能会消化不良,引起肠胃不适,或者上火等。 一天吃30几个杨梅会怎么样 虽…

    2025年4月26日
    230.3K00
  • 荔枝吃几颗是正常

    荔枝是夏季比较受欢迎的一种水果,它的果肉比较饱满,吃起来香甜可口,可以做各种各样的美食小吃,深受人们喜欢。荔枝虽然好吃,但是一次不能吃太多,通常吃一到两颗是比较正常的,最多不能超过10颗,不然就算过量食用了。 荔枝吃几颗是正常的 看个人情况…

    2025年4月26日
    595.1K00
  • 杨梅一天吃一斤一个人好吗

    杨梅是夏季比较常见的一种水果,它的吃法比较多,味道酸甜可口,营养价值高,深受人们喜欢。杨梅的吃法也是有很多的,可以直接吃果肉,也可以做饮品,还可以做甜点等,杨梅虽然好吃,但是一次不能吃太多,一个人一天不要吃一斤,这种属于过量食用。 杨梅一天…

    2025年4月26日
    428.1K00
  • 三种人不宜吃鹅蛋

    鹅蛋是生活中比较常见的一种蛋类食物,它可以起到很不错的功效与作用,适量食用对身体有一定好处,很多人都会经常吃鹅蛋,但是吃鹅蛋也有一些禁忌,并不是所有人都适合吃鹅蛋,比如蛋白质过敏的人、痛风患者以及肝炎病人等。 三种人不宜吃鹅蛋 1、蛋白质过…

    2025年4月26日
    80.1K00
  • 马卡龙什么时候吃口感最好

    马卡龙是比较受欢迎的一种甜点,它的口味比较丰富,吃起来味道很不错,很多人都喜欢吃,尤其是小孩和女性朋友们。马卡龙一般不建议在早餐期间食用,最好在下午茶的时候吃,通常马卡龙刚烤好放凉吃是最好的。 马卡龙什么时候吃口感最好 刚烤完放凉食用口感最…

    2025年4月24日
    821.8K00
  • 初伏吃什么食物好养生

    初伏是三伏天的第一个伏天,这个时候气温也是比较高的,通常会有三十多度的高温天气,比较炎热,要注意防暑降温,很多人都会通过饮食调理身体,在初伏的时候,建议吃清热解暑的食物、苦味食物以及蛋白吃高的食物等。 初伏吃什么食物好 1、多吃清热解暑、健…

    2025年4月24日
    732.1K00

发表回复

登录后才能评论