之前我在C(visual studio)中遇到了动态内存的问题.我有一个或多或少的工作程序,在释放其中一个缓冲区时会产生运行时错误.这是一个明显的内存损坏,程序写在缓冲区的末尾.
我的问题是,追踪是非常耗时的.在损坏之后错误被抛弃了,我不得不手动调试整个运行以找到缓冲区末尾何时被覆盖.
是否有任何工具\方式来帮助追踪此问题?如果该程序会立即崩溃我会发现问题更快...
问题的一个例子:
int *pNum = malloc(10 * sizeof(int));
// ||
// \/
for(int i = 0; i < 13; i++)
{
pNum[i] = 3;
}
// error....
free(pNum);
Run Code Online (Sandbox Code Playgroud) c memory-leaks memory-management visual-studio-2010 visual-c++
我们正在编写一个需要一次运行数小时的诊断工具,但是当我们尝试在应用程序运行几个小时后从CheckedListBox中删除项目时,我们遇到了一个神秘的Out of Memory Exception.
我们最初尝试使用checkedListBox.Items.Clear();
,经过一些谷歌搜索,我们尝试了类似以下的东西:
for (int i = checkedListBox.Items.Count - 1; i >= 0; i--)
{
checkedListBox.Items.RemoveAt(i);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,上述并没有解决问题.我在MSDN论坛上发现了这个想法,但我不能为我的生活今天早上再找到这个链接.然而,该论坛确实说有人描述了他们的应用程序并发现内存泄漏CheckedListBox.Items.Clear()
.
有没有人知道功能性的工作?
编辑: FingerTheCat的答案暂时解决了我们的问题,所以我现在将其标记为答案.但是,我们已经开始梳理代码以尝试找到真正的问题.不幸的是,目前的实施主要是意大利面条代码,所以可能需要几天时间才能找到.
我在Android应用程序中工作,我使用位图将图像绑定到ImageView.我的要求是旋转ImageView并为该ImageView提供边框.我已经成功实现了这一点,但是在应用程序使用此活动两到三次之后,出现"强制关闭"错误,表示Bitmap不在VM内存中.请帮我最小化代码中的位图内存消耗.让我知道如何修改相同的代码?
final int BORDER_WIDTH = 5;
// Set the border color
final int BORDER_COLOR = Color.WHITE;
Bitmap res = Bitmap.createBitmap(CAPTURE_IMAGE.getWidth() + 2
* BORDER_WIDTH, CAPTURE_IMAGE.getHeight() + 2 * BORDER_WIDTH,
CAPTURE_IMAGE.getConfig());
System.gc();
Canvas canvas = new Canvas(res);
Paint paint = new Paint();
paint.setColor(BORDER_COLOR);
canvas.drawRect(0, 0, res.getWidth(), res.getHeight(), paint);
canvas.drawBitmap(CAPTURE_IMAGE, BORDER_WIDTH, BORDER_WIDTH, paint);
Matrix mat = new Matrix();
// Set the Imageview position
mat.postRotate(355);
bMapRotate = Bitmap.createBitmap(res, 0, 0, res.getWidth(),
res.getHeight(), mat, true);
System.gc();
res.recycle();
res = null;
paint = null;
canvas …
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的脚本,它分配内存,dels
唯一引用一个相当大的对象,一直打印heapy
和pidstat
报告.在运行脚本之后,heapy告诉我,当pidstat告诉我相反时,不应该使用太多内存:
from guppy import hpy
import time
import sys
import os
'''
1) print heapy and pidstat report after starting and before actually doing any work
2) allocate some memory in a simple 2d array
3) print heapy and pidstat report
4) del the d2 array (attempt at garbage collection)
5) print heapy and pidstat report
6) sleep so pidstat can continue to be run to check on memory
'''
def pidstat(msg):
print '===============================' …
Run Code Online (Sandbox Code Playgroud) 真的开始享受KnockoutJs(http://knockoutjs.com).我的大多数网络应用都是ajax驱动的.加载整个站点,然后从链接到链接我们只需通过ajax调用更改正文内容.
当ajax返回新的body内容时,我可以执行我的Knockout绑定.没问题.当我链接到下一页(只是一个更换身体的ajax调用).我认为Knockout建筑物仍然在记忆中,但由于dom已经改变,因此并没有真正受到限制.关于这个主题的一些问题.
如果下一页上没有任何Knockout,那么将淘汰对象留在内存中的那种真的很糟糕吗?更好的是有没有办法重置(清除)淘汰对象?
当我从一个具有敲除绑定的页面转到另一个具有敲除绑定的页面时,只是调用ko.applyBindings()再次清除旧的东西并重新绑定新的东西?(再一次,当我说从一个页面转到另一个页面时,我只是用ajax调用重新加载身体).
淘汰赛是否有任何"实时"绑定.有点像jQuery的实时绑定?这样就可以预先加载Knockout,然后不必将内容更改重新应用到内容更改.
一般情况下,我正在寻找关于如何在一个应用程序中从页面到页面最佳使用淘汰的建议,其中浏览器不会在页面之间刷新.
在此先感谢您的帮助.
假设我有一个简单的http服务器,例如:
var http = require('http');
http.createServer(function (req, res) {
req.on('data', function (data) {
console.log('Got some data: ' + data);
});
req.on('end', function () {
console.log('Request ended!');
});
res.end('Hello world!');
}).listen(3000);
Run Code Online (Sandbox Code Playgroud)
所以,基本上是默认的101样本,到目前为止没什么特别的 - 除了我订阅了可读流data
的end
事件req
.现在我想知道当我不再需要这些事件时是否必须取消订阅这些事件?
或者当可读流结束时它们会自动清除吗?
像这样的代码会导致内存泄漏吗?
我正在调试我在Tomcat应用程序中使用多年的问题 - 重新启动应用程序时导致的内存泄漏,因为Webapp类加载器无法进行GC.我用JProfiler拍摄堆的快照,似乎至少有一些我的静态变量没有被释放.
某些类具有静态最终成员,该成员在首次加载类时初始化,并且因为它是最终的,所以我无法在应用程序关闭时将其设置为null.
静态最终变量是Tomcat中的反模式,还是我错过了什么?我刚刚开始使用JProfiler 8,所以我可能误解了传入的引用告诉我的内容.
干杯!
卢克
我有一个大型的pandas数据帧(大小= 3 GB):
x = read.table('big_table.txt',sep ='\ t',header = 0,index_col = 0)
因为我在内存限制下工作,所以我对数据帧进行了子集化:
rows = calculate_rows()#一个计算我需要的行的函数
cols = calculate_cols()#计算我需要的cols的函数
x = x.ix [rows,cols]
计算行和列的函数并不重要,但它们绝对是原始行和列的较小子集.但是,当我执行此操作时,内存使用量会增加很多!最初的目标是将内存占用减少到3GB以下,但内存使用量远远超过6GB.
我猜这是因为Python在内存中创建了数据帧的本地副本,但是没有清理它.可能还有其他事情正在发生......所以我的问题是如何对大型数据框进行子集化并清理空间?我找不到一个选择行/列的函数.
我已经阅读了很多Stack Overflow,但在这个主题上找不到多少.可能是我没有使用正确的关键字,所以如果你有建议,这也可能有所帮助.谢谢!
好的,首先,公平警告,这是一个班级的项目.除了修复我的内存泄漏之外,我不是在寻找任何帮助.我想我已经在这个C代码的空间上遵循了一些可怕的编码实践.无论如何,当我运行Valgrind来搜索内存泄漏发生的位置时,我一点都不清楚我错过了什么内存泄漏.我知道至少有两个字符串,我没有释放,但我malloc()编辑,纯粹基于valgrind输出的大小.因为我从项目中获取了一些无关的代码,valgrind行号很可能已经关闭,因此为了方便起见,我将它们标记为注释.
一点背景,我正在编写shell的基本功能.它目前执行以下操作:
1.接受用户输入
2.将输入解析为cmdin结构
3.执行命令,前提是它没有管道.
4.从我创建的cmdin中取出空间,然后从步骤1重新开始.这就是问题发生的地方.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_SIZE 1024
#define MAX_CLEN 2097152
#define READ_END 0
#define WRITE_END 1
#define CHILD_STATUS 0
struct cmdin
{
char *cmd;
char **args;
int nargs;
int pipeflag;
};
//check if the last argument of the command passed to it is a pipe.
//if so, return the position of the pipe, otherwise, return 0
//if it has already found a pipe, it will return the …
Run Code Online (Sandbox Code Playgroud) 假设您有一个Collection<B>
,并且您即将删除一个项目.实例B
是从一个实例A
引用的,并引用了一个实例C
,如第一张图所示:
图A http://i43.tinypic.com/240wuqh.jpg
现在,由于存在指向B的引用,因此毫无疑问该对象被"删除"或被垃圾收集.它只是从集合中删除,就像这样,对吗?
图B http://i41.tinypic.com/4uxnp3.png
现在,让我们使用Collection<A>
与之前相同的引用层次结构,让我们删除A的实例.
图C http://i44.tinypic.com/1zd93dt.png
如果没有其他引用A
,不仅它从集合中删除,它被标记为垃圾.我对吗?并且怎么样B
和C
?它们是否也成为垃圾,除非B
引用一个实例,否则没有其他引用C
?
这是我所面临的简化.我想A
从集合中删除一个实例,我想确保B
并C
继续使用它.在A
我不再收集的地方,所有仍然活着的"孩子"对我来说都是记忆泄漏.
当我看到我制作的这些照片时,这个问题似乎太愚蠢了.但我的情况有点不那么微不足道.它看起来像这样:
图4 http://i41.tinypic.com/2ymhlq0.png
A Model
A Model
有一个B Model
实例集合(在Model和ViewModel层中B
都是一种子类A
)B Model
"知道它的父亲" - 引用其父"模型"实例我有这些A ViewModel
实例的集合.当我删除一个时,我需要其他所有内容.如果所涉及的任何实例没有其他"外部参考"(基本上,没有其他箭头指向图片外部),被移除的"ViewModel"实例是否会将所有孩子带走?如果是这样,是否有任何"陷阱"可以使这种简化误导?如果我完全错了,为什么?:)
感谢您阅读这篇文章!
memory-leaks ×10
c ×2
c# ×2
python ×2
.net ×1
android ×1
java ×1
jprofiler ×1
knockout.js ×1
memory ×1
node.js ×1
pandas ×1
python-2.7 ×1
tomcat ×1
valgrind ×1
visual-c++ ×1
winforms ×1