移动结构指针,导致内存泄漏的问题。。。。。(100分)

  • 主题发起人 主题发起人 baije
  • 开始时间 开始时间
B

baije

Unregistered / Unconfirmed
GUEST, unregistred user!
TYPE
SATINFO=record
p:array [0..2] of double

v:array [0..2] of double

el:double

az:double

end;
sat_if=^SATINFO;

在一循环内对指针进行INC,如下
var s_num:integer;
sat_p:sat_if;
sat:SATINFO;
begin
inc(s_num,25)
//每隔25组数,取一次
sat_p:=test();//test为返回内存首地址的函数
inc(sat_p,s_num);//出现内存泄漏,注释掉这句就没有内存泄漏
sat:=^sat_p;
//后面取值
end;
test()函数将我要读取的数据存在一段内存中,每次返回内存首地址。
目的是想每隔25组数取一次,即在内存中每次向前移动25个SATINFO,再取值。。

大家帮忙看看是怎么回事,谢谢了。。
 
sat:=^sat_p;
这点写错了,是sat:=sat_p^;
 
inc(sat_p,s_num);//出现内存泄漏,注释掉这句就没有内存泄漏
sat_p是sat_if的实例,是指针类型,是不是该这样写


inc(@sat_p,s_num)
 
代码不完整,不清楚哪部分在循环体内,仅仅是推测
sat_p 开始指向数组首地址,当你inc(sat_p,s_num)之后sat_p发生了变化,
等你下一次循环时是从上次的地址开始增加的,而s_num也同步增加了
解决问题两个思路
1、用一个临时指针保存原始sat_p
2、保持s_num不变
 
把inc(s_num,25);这句 放到最inc(sat_p,s_num);下面试试。
 
你是隔25个取一个, 如果有100个元素我想你的循环一定会执行4次,执行到第4次是s_num= 100;
inc(sat_p,s_num)
会使sat_p指向101个元素。
 
to tseug
这个test()函数是每次执行都返回内存首地址,所以每次都是从首地址开始向后移。
下面是循环体内的。
begin
inc(s_num,25)
//每隔25组数,取一次
sat_p:=test();//test为返回内存首地址的函数
inc(sat_p,s_num);//出现内存泄漏,注释掉这句就没有内存泄漏
sat:=^sat_p;
//后面取值
end;
 
单纯从这个代码里看不出内存泄漏的原因,问题是不是出现在s_num初值上?初值是0吗?
再就是 test这个函数了,他返回的首地址不会有问题吧?会不会是他返回了指向局部
变量的地址?
 
s_num是全局变量,是0的,
如果返回的是其它变量的地址我取数一定会错的,但现在取数都不错的
 
var s_num:integer;
sat_p:sat_if;
sat:SATINFO;
begin
// s_num没有初始化? 而且是局部变量? 每次默认是零?
inc(s_num,25)
//每隔25组数,取一次
sat_p:=test();//test为返回内存首地址的函数
inc(sat_p,s_num * sizeof(SATINFO));//出现内存泄漏,注释掉这句就没有内存泄漏
// 这个地方你取的位置不对
sat:=sat_p^;
//后面取值
end;

你的程序很乱,而且不完整, 搞不清楚你到底想做什么
 
在程序中加上语句判断边界sat_p,s_num应该可以解决吧
 
to 不能没有你
代码确实不完整,我只是取了主要的部分,思路就是这样。
inc(sat_p,s_num * sizeof(SATINFO));
sat_p已以定义了是结构体指针了,移动时是知道移动的大小,还需要去用s_num * sizeof(SATINFO)来确实移动的大小吗?
 
to 不能没有你
我试了,移动指针时不能这样写,因为sat_p是结构体指针,这样写就取出范围了,我再把结构体指针所指的值赋给结构体时就会出现取数错误。。
 
你是怎么发现有内存泄漏的?
 
to tseug
在资源管理器中看到程序的进程大概是每秒加4K,因为我这个取数和显示是放在一个窗体里的,我把这个窗体关闭后,保留其它窗体显示时内存保持不变,所以先确定了问题出在哪个窗体,然后在程序中分两部分查找,一个是显示数据部分、一个是读取数据部分。先把显示数据部分代码注释掉,观察发现内存还会增加,便排除是显示数据部分的原因。从而进一步查找读取数据这部分,后来发现内存增加就是移动指针这部分,我不移动指针,即每次只取第1组数据时内存不增加,所以确定内存增加出在移动指针这块。
 
理论上移动指针不会导致内存泄露,你这样试试看还泄漏吗?
inc(sat_p,0);//
 
学习而来~~
 
代码很乱,按照你的代码,应该有dispose才对!你说test()申请内存块并返回首地址,很可能出现没有dispose的情况。修改的代码如下:
var s_num:integer;
firs_p, p:sat_if;
begin
inc(s_num,25)
//每隔25组数,取一次
first_p:=test();//test为返回内存首地址的函数
p = first_p;
inc(p,s_num);//出现内存泄漏,注释掉这句就没有内存泄漏
// p^ 即对应的数据记录;
//后面取值
//完成操作后:
dispose(first_p);
end;
 
to Kingron
我按你的方法试了,提示出错,(raised exception class einvalid pointer with message''invalid point operation'')
是不是要先给这个指针申请内存啊,还是不能操作这种类型的指针。
 
上面的代码是伪代码,只是一个类似意思,我没有测试,你自己看着实际情况修改一下。
 
后退
顶部