为什么 valgrind 在我的“测试”程序中没有检测到内存泄漏? [复制]

2024-02-19

整个测试代码包含在main.cpp中,如下:

#include <iostream>

using std::cout;
using std::endl;

void f(int i) {
    int* pi = new int;

    *pi = i;

    std::cout << "*pi = " << *pi << std::endl;
}

int main(int argc, char *argv[]) {
    int i = 0;

    while (i < 10000) {
        f(i);
        ++i;
    }

    return 0;
}

我编译时没有优化-O0(来自 Eclipse Qt 项目):

g++ -c -pipe -O0 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -Irelease -o release/main.o main.cpp

然后链接如下:

g++ -Wl,-O0 -o test release/main.o    -L/usr/lib -lQtGui -lQtCore -lpthread 

我通过 valgrind 运行可执行文件并得到以下输出:

laptop:~/workspace/test$ valgrind --leak-check=yes test
==3939== Memcheck, a memory error detector
==3939== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==3939== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==3939== Command: test
==3939== 
==3939== 
==3939== HEAP SUMMARY:
==3939==     in use at exit: 0 bytes in 0 blocks
==3939==   total heap usage: 1,387 allocs, 1,387 frees, 64,394 bytes allocated
==3939== 
==3939== All heap blocks were freed -- no leaks are possible
==3939== 
==3939== For counts of detected and suppressed errors, rerun with: -v
==3939== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8)

我相信 valgrind 应该报告内存泄漏,而不是因为调用中分配的堆内存而不可能发生泄漏new int

编辑:更改上面的代码以使用 std::cout 而不是 qDebug() 具有相同的结果

如果我编译并链接没有 Qt 依赖项的相同代码(来自 Eclipse CDT 项目),valgrind 会检测到泄漏:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"

g++  -o"test2"  ./main.o   

==4604== HEAP SUMMARY:
==4604==     in use at exit: 40,000 bytes in 10,000 blocks
==4604==   total heap usage: 10,000 allocs, 0 frees, 40,000 bytes allocated
==4604== 
==4604== 40,000 bytes in 10,000 blocks are definitely lost in loss record 1 of 1
==4604==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==4604==    by 0x8048756: f(int) (main.cpp:7)
==4604==    by 0x80487BB: main (main.cpp:18)
==4604== 
==4604== LEAK SUMMARY:
==4604==    definitely lost: 40,000 bytes in 10,000 blocks
==4604==    indirectly lost: 0 bytes in 0 blocks
==4604==      possibly lost: 0 bytes in 0 blocks
==4604==    still reachable: 0 bytes in 0 blocks
==4604==         suppressed: 0 bytes in 0 blocks
==4604== 
==4604== For counts of detected and suppressed errors, rerun with: -v
==4604== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 19 from 8)

我正在使用 Kubuntu 10.04 32 位,并尝试了调试和发布版本,我做错了什么或者为什么 valgrind 在与 Qt 链接时不报告内存泄漏?


发生这种情况的原因是调用:

valgrind --leak-check=yes test

实际上是在 /usr/bin/test 上运行 valgrind,这是一个检查文件类型并比较值的内置程序,我所需要的只是:

valgrind --leak-check=yes ./test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 valgrind 在我的“测试”程序中没有检测到内存泄漏? [复制] 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐