标签: memory-leaks

在valgrind仍然可以到达

虽然搜索valgrind仍然可以访问,但有些人说这不是问题.我们不需要解决它.有人说它需要修复.如果有人可以明确地告诉我这仍然可以达到的逻辑,我会更好.是否必须修复此问题?

[编辑]

我有我的C程序的valgrind输出.我需要修复它吗?

      LEAK SUMMARY:
      ==27333==    definitely lost: 0 bytes in 0 blocks.
      ==27333==      possibly lost: 0 bytes in 0 blocks.
      ==27333==    still reachable: 96 bytes in 12 blocks.
      ==27333==         suppressed: 0 bytes in 0 blocks.
Run Code Online (Sandbox Code Playgroud)

memory debugging valgrind memory-leaks memory-management

6
推荐指数
1
解决办法
6164
查看次数

帮助奇怪的记忆行为.寻找我的大脑和我的代码中的泄漏

我花了最近几天试图在我们正在开发的程序中找到内存泄漏.

首先,我尝试使用一些检漏仪.在解决了一些问题后,他们不再发现任何泄漏.但是,我也在监视我的应用程序perfmon.exe.当使用该应用程序时,性能监视器报告"私有字节"和"工作集 - 私有"正在稳步上升.对我而言,这表明程序运行的时间越长,内存越来越多.然而,内部资源似乎很稳定,所以这听起来像是泄露给我.

该程序正在运行时加载DLL.我怀疑这些泄漏或它们在该库中发生的任何泄漏,并在卸载库时被清除,因此它们不会被泄漏检测器拾取.我使用DevPartner BoundsChecker和Virtual Leak Detector来查找内存泄漏.据说两者都可以捕获DLL中的泄漏.

此外,内存消耗逐步增加,这些步骤大致但不完全一致,与我在应用程序中执行的某些GUI操作一致.如果这些是我们代码中的错误,那么每次执行操作时都会触发它们,而不是大多数时间.

每当我面对如此多的陌生感时,我就开始质疑我的基本假设.所以我转向你,谁知道一切,提出建议.我的假设有缺陷吗?您是否知道如何解决此类问题?

编辑:
我目前在Windows 7 64上使用Microsoft Visual C++(x86).

Edit2:
我刚刚使用IBM Purify来寻找泄漏.首先,它将整个程序的30%列为泄漏内存.这不可能是真的.我想它是将整个DLL识别为泄露或类似的东西.但是,如果我每隔几次操作就会搜索新的泄漏,它会报告与性能监视器报告的大小增加相对应的泄漏.这可能导致泄漏.可悲的是,我只使用Purify的试用版,因此它不会向我显示这些泄漏的实际位置.(这些泄漏仅在运行时出现.当程序退出时,任何工具都不会报告任何泄漏.)

c++ memory debugging memory-leaks

6
推荐指数
1
解决办法
433
查看次数

pthread_create后跟pthread_detach仍会导致Valgrind中可能丢失的错误

我有一个问题,Valgrind告诉我,我可能会丢失一些内存:

==23205== 544 bytes in 2 blocks are possibly lost in loss record 156 of 265
==23205==    at 0x6022879: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23205==    by 0x540E209: allocate_dtv (in /lib/ld-2.12.1.so)
==23205==    by 0x540E91D: _dl_allocate_tls (in /lib/ld-2.12.1.so)
==23205==    by 0x623068D: pthread_create@@GLIBC_2.2.5 (in /lib/libpthread-2.12.1.so)
==23205==    by 0x758D66: MTPCreateThreadPool (MTP.c:290)
==23205==    by 0x405787: main (MServer.c:317)
Run Code Online (Sandbox Code Playgroud)

创建这些线程的代码(MTPCreateThreadPool)基本上获取一个等待pthread_t槽的块的索引,并创建一个带有该线程的线程.TI成为指向具有线程索引和pthread_t的结构的指针.(简化的/消毒):

for (tindex = 0; tindex < NumThreads; tindex++)
  {
  int rc;
  TI = &TP->ThreadInfo[tindex];
  TI->ThreadID = tindex;

  rc = pthread_create(&TI->ThreadHandle,NULL,MTPHandleRequestsLoop,TI);
  /* check for non-success that I've omitted */
  pthread_detach(&TI->ThreadHandle); …
Run Code Online (Sandbox Code Playgroud)

c memory multithreading memory-leaks pthreads

6
推荐指数
2
解决办法
2417
查看次数

我找到了libxml2错误(多线程解析中的内存泄漏)?

我正在使用libxml2实际处理数据处理代码.我被困在一个无法移除的内存泄漏上.这是生成它的最小代码:

#include <stdlib.h>
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <omp.h>

int main(void)
{
    xmlDoc *doc;
    int tn;
    char fname[32];

    omp_set_num_threads(2);
    xmlInitParser();
    #pragma omp parallel private(doc,tn,fname)
    {
        tn  = omp_get_thread_num();
        sprintf(fname,"testdoc%d.xml",tn);
        doc = xmlReadFile(fname,NULL,0);
        printf("document %s parsed on thread %d (%p)\n",fname,tn,doc);
        xmlFreeDoc(doc);
    }
    xmlCleanupParser();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,输出为:

document testdoc0.xml parsed on thread 0 (0x1005413a0)
document testdoc1.xml parsed on thread 1 (0x1005543c0)
Run Code Online (Sandbox Code Playgroud)

确认我们确实有多线程,并且doc在并行区域中确实是私有的.可以注意到我正确应用了libxml2(http://xmlsoft.org/threads.html)的线程安全说明.Valgrind报道:

HEAP SUMMARY:
    in use at exit: 9,000 bytes in 8 blocks …
Run Code Online (Sandbox Code Playgroud)

c memory-leaks openmp libxml2

6
推荐指数
1
解决办法
3560
查看次数

用户在linux下按ctrl + c时如何避免内存泄漏?

在我用C和C++编写的程序中,我将新建一个对象来完成任务,然后删除该对象.

在新对象之后但在删除对象之前的那一刻,如果用户按下ctrl+ c以中断进程,则将导致不调用delete并发生内存泄漏.

我该怎么做才能避免这种情况?

此外,如果操作系统回收了内存,那么打开的文件呢?它们是由操作系统关闭还是我应该手动关闭它们?

c memory-leaks

6
推荐指数
2
解决办法
5449
查看次数

为什么标记删除析构函数是因为Windows上的向量删除而被调用的?

我有一个在Windows上泄漏的代码.它在许多unix平台上运行正常,泄漏只发生在Windows上.二进制文件由exe,1 dll和2个静态库组成.exe链接到dll和静态库,而静态库也链接到dll.当代码调用向量删除析构函数时,在exe代码中发生泄漏,由于某种原因,标量删除析构函数被调用.这导致只删除数组中的第一个对象,而数组的其余部分保留在内存中.

泄漏的伪代码如下所示:

class MyClassFromExe : public MyBaseClassFromDll {
  public:
    ClassFromDll* m_arr;

    MyClassFromExe(unsigned int size)  
    {
      m_arr = new ClassFromDll[size];
    }

    ~MyClassFromExe() 
    {
      delete [] m_arr;
    }
};

void func()
{
  MyClassFromExe obj(3);
}
Run Code Online (Sandbox Code Playgroud)

当func()完成并且析构函数被调用时,我看到只调用了m_arr中第一个对象的析构函数.从调试器我看到这​​是通过标量删除析构函数而不是从矢量删除析构函数完成的.这解释了为什么只有第一个对象被销毁.我需要理解的是,当使用delete []时,为什么要调用标量删除析构函数?

我找到了这个线程 - 为什么矢量删除析构函数是由于标量删除而被调用的?.我按照那里的建议,确保所有模块都使用/ MD编译.

重要的是要注意,当包含ClassFromDll的dll是静态库而不是dll时,一切正常.仅当静态库更改为dll时才会启动泄漏.当程序在Release模式下泄漏时,它会在delete [] m_arr上的Debug模式下崩溃.崩溃发生在dbgdel.cpp第52行--_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)中.

在unix平台上,这个lib也是一个共享库,正如预期的那样,在那里调用删除析构函数并且没有泄漏.可能问题出在VC编译器上吗?或者可能需要更改项目的其他一些设置?我正在使用VC2003.

先感谢您!

c++ debugging destructor memory-leaks vector

6
推荐指数
1
解决办法
2万
查看次数

为什么包装Data.Binary.Put monad会造成内存泄漏?(第2部分)

正如在我之前的问题中,我正在尝试将Data.Binary.Put monad包装到另一个monad中,以便稍后我可以问它"它要写多少字节"或"文件中的当前位置是什么"等问题.

之前,我认为理解为什么它在使用一个简单的(IdentityT?)包装器时会泄漏内存会导致我解决我的问题.但即使你们帮我解决了这个简单的包装器的问题,用StateT或WriterT之类的东西包装它仍然会消耗太多的内存(并且通常会崩溃).

例如,这是我试图包装它的一种方式,它为大输入泄漏内存:

type Out = StateT Integer P.PutM ()

writeToFile :: String -> Out -> IO ()
writeToFile path out = BL.writeFile path $ P.runPut $ do runStateT out 0
                                                         return ()

是一个更完整的代码示例,演示了该问题.

我想知道的是:

  1. 程序内部发生什么导致内存泄漏?
  2. 我该怎么办才能修复它?

对于我的第二个问题,我想我应该更详细地解释一下我打算在磁盘上查看数据:它基本上是一个树结构,其中树的每个节点都表示为它的子节点的偏移表(加上一些附加数据).因此,要计算第n个孩子到偏移表中的偏移量,我需要知道子项0到n-1的大小加上当前偏移量(为了简化事情,假设每个节点都有固定数量的子节点).

谢谢你的期待.

更新:感谢nominolo我现在可以创建一个包裹Data.Binary.Put的monad,跟踪当前偏移并几乎不使用任何内存.这是通过放弃使用StateT转换器来支持使用Continuations的不同状态线程机制来完成的.

像这样:

type Offset = Int

newtype MyPut a = MyPut
  { unS :: forall r . (Offset -> a -> P.PutM r) -> Offset -> P.PutM r }

instance Monad MyPut where
  return a = MyPut …

binary monads haskell memory-leaks monad-transformers

6
推荐指数
1
解决办法
537
查看次数

如果未从已销毁的活动中删除,侦听器是否会创建内存泄漏?

如果向控件/视图添加侦听器而不删除它,是否会创建内存泄漏?例如,onCreateEditText侦听修改的侦听器添加侦听器.你需要在onDestroy中删除这个监听器吗?

我想如果你使用一个匿名监听器或一个实现监听器的局部变量,当Activity由于作用域规则而被销毁时,内存将被释放.

我可以看到内存泄漏的唯一方法是监听器是否在intent对象中传递.思考?

java android memory-leaks android-activity

6
推荐指数
1
解决办法
6949
查看次数

如何清理Internet Exploreor中的JSONP内存

我是JSONP开发的新手,我发现IE 7/8不会清理JSONP脚本占用的内存.运行几个小时后,这会在我的页面中导致非常高的内存消耗.

我浏览了互联网,发现大多数修复都是基于Neil Fraser的提示.从博客中可以看出,您需要使用类似的代码删除脚本中的所有属性

    var tmp;
    while (tmp = document.getElementById('JSONP')) {
        tmp.parentNode.removeChild(tmp);

        // this deletion will create error in IE.
        for (var prop in tmp) delete tmp[prop];
        tmp = null;
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,删除将在IE中创建"对象不支持此操作"的错误,并且它不会释放内存.

所以我的问题是如何真正释放我的JSONP脚本的内存?

我把我的测试代码如下:

Testing.html

<html><head></head><body><script>
var script,
head = document.getElementsByTagName('head')[0],
loadCount= 0,
uuid= 1,
URL= "memleaktest.js?uuid=",

clearConsole = function() {
    var con= document.getElementById("console");
    while (con.childNodes.length) 
        con.removeChild(con.childNodes[0]);
},

log = function(msg) {
    var div= document.createElement("DIV"),
        text= document.createTextNode(msg),
        con= document.getElementById("console");

    div.appendChild(text);
    con.appendChild(div);
},

test = { "msg" : null, …
Run Code Online (Sandbox Code Playgroud)

javascript memory internet-explorer jsonp memory-leaks

6
推荐指数
1
解决办法
1024
查看次数

在Xcode环境中,Valgrind的等价物是什么?

最近我建议使用Valgrind检查我的iPhone项目(主要用C和Objective-C编写)的内存泄漏,错误等.

我对这种工作还很陌生,想知道Xcode中有哪些工具可以达到同样的目的.

非常感谢

memory xcode valgrind memory-leaks memory-management

6
推荐指数
2
解决办法
7960
查看次数