为什么 Valgrind 在使用 nightly 1.29.0 的 Rust 程序中没有检测到内存泄漏? [英] Why does Valgrind not detect a memory leak in a Rust program using nightly 1.29.0?

查看:87
本文介绍了为什么 Valgrind 在使用 nightly 1.29.0 的 Rust 程序中没有检测到内存泄漏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按照 这篇博文使用 Valgrind 检测 Rust 程序中的内存泄漏.我的源代码很简单:

I'm trying to detect a memory leak in a Rust program using Valgrind following this blog post. My source code is simply:

#![feature(alloc_system)]
extern crate alloc_system;

use std::mem;

fn allocate() {
    let bad_vec = vec![0u8; 1024*1024];
    mem::forget(bad_vec);
}

fn main() {
    allocate();
}

我希望对 mem::forget() 的调用会产生 Valgrind 能够发现的内存泄漏.但是,当我运行 Valgrind 时,它报告说不可能发生泄漏:

I expect the call to mem::forget() to generate a memory leak that Valgrind would be able to pick up on. However, when I run Valgrind, it reports that no leaks are possible:

[memtest]> cargo run
   Compiling memtest v0.1.0 (file:///home/icarruthers/memtest)
    Finished dev [unoptimized + debuginfo] target(s) in 0.28s
     Running `target/debug/memtest`
[memtest]> valgrind target/debug/memtest
==18808== Memcheck, a memory error detector
==18808== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==18808== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==18808== Command: target/debug/memtest
==18808== 
==18808== 
==18808== HEAP SUMMARY:
==18808==     in use at exit: 0 bytes in 0 blocks
==18808==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==18808== 
==18808== All heap blocks were freed -- no leaks are possible
==18808== 
==18808== For counts of detected and suppressed errors, rerun with: -v
==18808== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

我升级到最新的 nightly (1.29.0-nightly (6a1c0637c 2018-07-23)).

I am upgraded to the latest nightly (1.29.0-nightly (6a1c0637c 2018-07-23)).

我错过了什么?

推荐答案

Rust 1.32

从 Rust 1.32 开始,可执行文件的默认分配器现在是系统分配器,所以默认情况下你不需要设置任何东西.

Rust 1.32

As of Rust 1.32, the default allocator for an executable is now the system allocator, so you don't need to set anything by default.

您没有正确使用全局分配器设置.这是一个每晚功能,这意味着它随时都可能发生变化.您的博文已过期.

You aren't using the global allocator setting correctly. This is a nightly feature, which means that it's prone to change at any time. Your blog post is out of date.

查看模块文档,了解std::alloc 查看正确用法:

Check the module docs for std::alloc to see the correct usage:

#![feature(alloc_system)]
extern crate alloc_system;

#[global_allocator]
static GLOBAL: alloc_system::System = alloc_system::System;

use std::mem;

fn allocate() {
    let bad_vec = vec![0u8; 1024*1024];
    mem::forget(bad_vec);
}

fn main() {
    allocate();
}

root@3fb431791293:/tmp/vg# valgrind target/debug/vg
==6326== Memcheck, a memory error detector
==6326== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6326== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==6326== Command: target/debug/vg
==6326==
==6326==
==6326== HEAP SUMMARY:
==6326==     in use at exit: 1,048,576 bytes in 1 blocks
==6326==   total heap usage: 12 allocs, 11 frees, 1,050,753 bytes allocated
==6326==
==6326== LEAK SUMMARY:
==6326==    definitely lost: 1,048,576 bytes in 1 blocks
==6326==    indirectly lost: 0 bytes in 0 blocks
==6326==      possibly lost: 0 bytes in 0 blocks
==6326==    still reachable: 0 bytes in 0 blocks
==6326==         suppressed: 0 bytes in 0 blocks
==6326== Rerun with --leak-check=full to see details of leaked memory
==6326==
==6326== For counts of detected and suppressed errors, rerun with: -v
==6326== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

这篇关于为什么 Valgrind 在使用 nightly 1.29.0 的 Rust 程序中没有检测到内存泄漏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆