我的问题是关于调试内存泄漏,这似乎是一场噩梦.
在我的应用程序中有一个简单的类派生自TObject.该类的所有对象都存储在派生自TObjectList以下类的类的集合/列表中:
type
TOffer = class(TObject)
Item: string;
Price: string;
Id: string;
end;
TOffers = class(TObjectList<TOffer>)
protected
procedure SetOffer(I: Integer; AOffer: TOffer);
function GetOffer(I: Integer): TOffer;
public
property Offers[I: Integer]: TOffer read GetOffer write SetOffer
end;
Run Code Online (Sandbox Code Playgroud)
使用场景:
爬虫下载商品,解析商品并保存到对象集合.这种方法似乎很方便,因为我可以稍后引用这些对象(填充网格/列表,将它们写入文件等)
问题是正确处理对象以避免内存泄漏.该应用程序在启动时分配~4Mb内存,但在处理后~12k提供它吞噬32Mb.在过程完成后由未正确处理的对象/变量引起的泄漏.
ReportMemoryLeaksOnShutdown 显示可怕的数字,但关键是 - 我不知道在哪里看,以及如何正确调试该死的东西.
另一个例子是var MyString: string需要适当处置的变量!! 这对我来说很有见地:)我认为每个过程/函数都会自动管理超出范围的变量的垃圾收集.
商品列表由函数创建:
function GetOffersList: TOffers;
begin
Result := TOffers.Create;
while not rs.EOF do
begin
Offer := TOffer.Create;
try
// here come collected offer attributes as variables of …Run Code Online (Sandbox Code Playgroud) Java解决方案不是问题:
public boolean killCall(Context context) {
try {
// Get the boring old TelephonyManager
TelephonyManager telephonyManager =
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// Get the getITelephony() method
Class classTelephony = Class.forName(telephonyManager.getClass().getName());
Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony");
// Ignore that the method is supposed to be private
methodGetITelephony.setAccessible(true);
// Invoke getITelephony() to get the ITelephony interface
Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);
// Get the endCall method from ITelephony
Class telephonyInterfaceClass =
Class.forName(telephonyInterface.getClass().getName());
Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");
// Invoke endCall()
methodEndCall.invoke(telephonyInterface);
} catch (Exception ex) { // …Run Code Online (Sandbox Code Playgroud) 我有这个杰森
{
"Sucess": true,
"Msg": "OK",
"Ret": {
"First": 0,
"Next": true,
"Total": 60,
"Itens": [
{
"ID": 212121,
"Name": "uuuuuuuuuuuuuuuuuuuuuuuu",
"LcID": 9898,
"Oclao": false,
"Lal": {
"ID": 12202,
"Name": "pppppppppppppppppp",
"Pais": "Brasil",
"Dtc": 0.0
},
"Subtipo": {
"ID": 7458,
"Desc": "mnmnmnmnn"
},
"Tipo": {
"Sit": "cor1",
"Sitrm": 0,
"Name": "Shsdfow"
},
"Qtde": 0,
"Qntcoes": 0,
"Pubum": "adfsdfsdfs",
"Evias": {
"arq": {
"Mo": [
"site.com"
],
"Moir": [
"site.com"
]
}
}
},
{
"ID": 9797878,
"Name": "uuuuuuuuuuuuuuuuuuuuuuuu",
"LcID": 9898, …Run Code Online (Sandbox Code Playgroud) 在下面的单元中,我在IMPLEMENTATION部分声明了一个变量 - 该单元的本地变量.我还有一个在TYPE部分声明的过程,该过程接受一个参数并将该参数分配给有问题的局部变量.这个TFrame的每个实例都通过一个唯一的变量传递passMeTheVar.
我想要它做的是为帧的每个实例保留它自己的变量版本,与其他变量不同,并使用它来定义它的运作方式.然而,似乎正在发生的是所有实例都使用相同的值,即使我明确地将每个实例传递给另一个变量.
即:
Unit FlexibleUnit;
interface
uses
//the uses stuff
type
TFlexibleUnit=class(TFrame)
//declarations including
procedure makeThisInstanceX(passMeTheVar:integer);
private
//
public
//
end;
implementation
uses //the uses
var myLocalVar;
procedure makeThisInstanceX(passMeTheVar:integer);
begin
myLocalVar:=passMeTheVar;
end;
//other procedures using myLocalVar
//etc to the
end;
Run Code Online (Sandbox Code Playgroud)
现在在另一个Form中的某个地方,我将这个Frame放到了Design窗格上,有时在一个Form上有两个这样的框架,并在适当的位置声明它等等.每个都是独一无二的:
ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;
Run Code Online (Sandbox Code Playgroud)
当我做一个:
ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"
Run Code Online (Sandbox Code Playgroud)
它们似乎都共享相同的变量"myLocalVar".
原则上,我做错了吗?如果这是正确的方法那么这是调试我所拥有的东西(这个问题太大而无法发布),但如果这在原则上不正确那么有没有办法做我建议的事情?
编辑:
好的,所以这里学到的教训是类定义就是这样.许多类可以放在一个单元中,该Type部分中所有类的所有实例共享单元的实现部分.
在Delphi XE2中,System.Str发生了一些变化.以下程序:
procedure someProcedure;
var
E:double;
outString:string;
begin
E:=-1.7E+308;
Str(E:i:j, outString);
end;
Run Code Online (Sandbox Code Playgroud)
引发访问冲突
(异常类$ C0000005,访问冲突0x00407318:读取地址0x30303028)
在Delphi XE2中,'i'和'j'是整数.这个相同的代码在Delphi 2010中运行正常并返回outString =' - 1.7E + 0308'.在一些TurboPower Orpheus组件中使用了类似的代码,它会导致整个IDE在BEX错误时崩溃.
这是在Win7 64位.有任何想法吗?
编辑:额外信息
这似乎只发生在负数大的情况下.Str似乎会生成长字符串,当它们超过~130个字符时会断开.
注意:当仅使用宽度(其中i =某个宽度)时,这不会中断
procedure someProcedure;
var
E:double;
outString:string;
begin
E:=-1.7E+308;
Str(E:i, outString);
end;
Run Code Online (Sandbox Code Playgroud) 我想在对角线的中心放置水印.我的代码做得很好但是水印没有出现在每个图像的中心.我认为水印文本的位置存在问题我硬编码值.如何编写通用公式为水印文本的位置.
private MemoryStream ApplyWaterMark(MemoryStream stream)
{
System.Drawing.Image Im = System.Drawing.Image.FromStream(stream); //
Graphics g = Graphics.FromImage(Im);
// Create a solid brush to write the watermark text on the image
Brush myBrush = new SolidBrush(System.Drawing.Color.FromArgb(25,
System.Drawing.Color.LightSteelBlue));
var f = new System.Drawing.Font(FontFamily.GenericSerif, 30);
// Calculate the size of the text
SizeF sz = g.MeasureString("TEST WATER MARK", f);
int X, Y;
X = ((int)(Im.Width - sz.Width) / 2)-1162;
Y = ((int)(Im.Height + sz.Height) / 2)-127;
g.RotateTransform(-45f);
g.DrawString("TEST WATER MARK", f, myBrush,new System.Drawing.Point(X, Y));
g.RotateTransform(45f); …Run Code Online (Sandbox Code Playgroud) 我在文本文件中有这10个数字(每行一个),我需要按照从最高编号开始的时间顺序对它们进行排序.我编写的代码工作得很好,但问题是代码不灵活,因为一旦我向文本文件中添加另一个数字,它将无法工作,因为代码设置为仅排序10个数字...这是由于我的整数数组应该在排序过程开始之前读取值,但是不允许我向数组的属性添加变量,因此它将能够读取和排序任意大小的文本文件.我知道必须有一种方法来制作一个可以对这种结构的任何大小的文件进行排序的程序,请告诉我如何改进我的代码.(如果你认为我的方式效率不高,那是因为这是我从高中毕业的作业,我需要使用这些数组实现一个bubbleort).
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
numbers, sortednumbers : TextFile;
count : integer=0;
number : array[1..10] of integer;
I : integer;
Procedure Swap(var X, Y : Integer);
var
Temp : integer;
begin
Temp := X;
X := Y;
Y := Temp;
end;
procedure Assign;
var I : Integer;
begin
reset(numbers);
for I := 1 to count do ReadLn(numbers, number[I]);
end;
procedure BubbleSort;
var I, J : integer;
begin
for I := 2 to count do
begin
for J …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Excel Interop 从 Excel 工作表中提取数据。此处使用范围内的单元格包含日期/时间值。我已经设法将值作为文本获取,但是如何将其转换为可用于比较操作的数字或日期/时间格式?
using System;
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main(string[] args)
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
string str;
int rCnt = 0;
int cCnt = 0;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("Wind_Speed.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
for (cCnt = 1; cCnt <= …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的控制台应用程序,以测试基于Microsoft在msdn上的示例的Parallel.Invoke的性能:
public static void TestParallelInvokeSimple()
{
ParallelOptions parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = 1 }; // 1 to disable threads, -1 to enable them
Parallel.Invoke(parallelOptions,
() =>
{
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("Begin first task...");
List<string> objects = new List<string>();
for (int i = 0; i < 10000000; i++)
{
if (objects.Count > 0)
{
string tempstr = string.Join("", objects.Last().Take(6).ToList());
objects.Add(tempstr + i);
}
else
{
objects.Add("START!");
}
}
sw.Stop();
Console.WriteLine("End first task... {0} seconds", sw.Elapsed.TotalSeconds);
}, …Run Code Online (Sandbox Code Playgroud) 我的程序停止读取任何行,并在此过程之后结束程序,如"结束".之后(但不是):
Procedure BubbleSort;
var i, j : integer;
begin
for i := 0 to count - 1 do begin
for j := count - 1 downto i do
if (together[j] > together[j - 1]) then
Swap(together[j - 1], together[j]);
end;
end;
Run Code Online (Sandbox Code Playgroud) delphi ×7
c# ×3
bubble-sort ×2
pascal ×2
.net ×1
android ×1
arrays ×1
delphi-units ×1
delphi-xe2 ×1
excel ×1
garbage ×1
geometry ×1
instances ×1
json ×1
local ×1
math ×1
memory-leaks ×1
performance ×1
phone-call ×1
sorting ×1
variables ×1