虽然搜索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) 我花了最近几天试图在我们正在开发的程序中找到内存泄漏.
首先,我尝试使用一些检漏仪.在解决了一些问题后,他们不再发现任何泄漏.但是,我也在监视我的应用程序perfmon.exe
.当使用该应用程序时,性能监视器报告"私有字节"和"工作集 - 私有"正在稳步上升.对我而言,这表明程序运行的时间越长,内存越来越多.然而,内部资源似乎很稳定,所以这听起来像是泄露给我.
该程序正在运行时加载DLL.我怀疑这些泄漏或它们在该库中发生的任何泄漏,并在卸载库时被清除,因此它们不会被泄漏检测器拾取.我使用DevPartner BoundsChecker和Virtual Leak Detector来查找内存泄漏.据说两者都可以捕获DLL中的泄漏.
此外,内存消耗逐步增加,这些步骤大致但不完全一致,与我在应用程序中执行的某些GUI操作一致.如果这些是我们代码中的错误,那么每次执行操作时都会触发它们,而不是大多数时间.
每当我面对如此多的陌生感时,我就开始质疑我的基本假设.所以我转向你,谁知道一切,提出建议.我的假设有缺陷吗?您是否知道如何解决此类问题?
编辑:
我目前在Windows 7 64上使用Microsoft Visual C++(x86).
Edit2:
我刚刚使用IBM Purify来寻找泄漏.首先,它将整个程序的30%列为泄漏内存.这不可能是真的.我想它是将整个DLL识别为泄露或类似的东西.但是,如果我每隔几次操作就会搜索新的泄漏,它会报告与性能监视器报告的大小增加相对应的泄漏.这可能导致泄漏.可悲的是,我只使用Purify的试用版,因此它不会向我显示这些泄漏的实际位置.(这些泄漏仅在运行时出现.当程序退出时,任何工具都不会报告任何泄漏.)
我有一个问题,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) 我正在使用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和C++编写的程序中,我将新建一个对象来完成任务,然后删除该对象.
在新对象之后但在删除对象之前的那一刻,如果用户按下ctrl+ c以中断进程,则将导致不调用delete并发生内存泄漏.
我该怎么做才能避免这种情况?
此外,如果操作系统回收了内存,那么打开的文件呢?它们是由操作系统关闭还是我应该手动关闭它们?
我有一个在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.
先感谢您!
正如在我之前的问题中,我正在尝试将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 ()
这是一个更完整的代码示例,演示了该问题.
我想知道的是:
对于我的第二个问题,我想我应该更详细地解释一下我打算在磁盘上查看数据:它基本上是一个树结构,其中树的每个节点都表示为它的子节点的偏移表(加上一些附加数据).因此,要计算第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 …
如果向控件/视图添加侦听器而不删除它,是否会创建内存泄漏?例如,onCreate
向EditText
侦听修改的侦听器添加侦听器.你需要在onDestroy中删除这个监听器吗?
我想如果你使用一个匿名监听器或一个实现监听器的局部变量,当Activity
由于作用域规则而被销毁时,内存将被释放.
我可以看到内存泄漏的唯一方法是监听器是否在intent对象中传递.思考?
我是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) 最近我建议使用Valgrind检查我的iPhone项目(主要用C和Objective-C编写)的内存泄漏,错误等.
我对这种工作还很陌生,想知道Xcode中有哪些工具可以达到同样的目的.
非常感谢