堆栈溢出了,咋办?stack overflow

livin 2003-08-21 02:09:40
delphi程序堆栈溢出。怎么办?
申请的数组空间我已经作了释放了,难道这样不对?
setlength(dataarray,i);
.....
dataarray:=nil
...全文
316 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxpbuaa 2003-08-22
  • 打赏
  • 举报
回复
你从下面(而不是dll)调用StreamFreqTestBlock看看是否有溢出:
procedure StreamFreqTestBlock(StreamBuf: PChar; StreamLen: Integer; OneCount: PInteger);
var
I, n1,n,buf_order: Integer;
StreamByte,TempByte: Byte;
label TestEnd;
begin
n1 := 0;
n := 0;
buf_order := 0;
while True do
begin
StreamByte := Ord(StreamBuf[buf_order]);
Inc(buf_order);
for I := 0 to 7 do
begin
TempByte := StreamByte and 128;
if TempByte <> 0 then Inc(n1);
StreamByte := StreamByte shl 1;
Inc(n);
if n = StreamLen then goto TestEnd;
end;
end;
TestEnd:
OneCount^ := n1;
end;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
tonylk 2003-08-22
  • 打赏
  • 举报
回复
不一定要用递归来做,这样需要补断的函数压栈,速度慢,也耗资源,用一个堆栈来保存你的临时信息,处理函数每次从栈顶取得数据进行处理,处理完的数据退栈,这样应该会好点,

还有内存管理,可以自己预先声请一个足够大的内存,然后自己写函数负责从这块区域内分配内存和释放内存,在实际代码中就用这些函数来取得内存。。。。因为delphi中的new,getmem等函数,在分配万内存后释放似乎有点延时,而且较容易产生内存碎片,所以如果你每次声请的内存大小基本固定,还是自己出来好。可以避免内存的无限制增长。

tonylk 2003-08-22
  • 打赏
  • 举报
回复
不一定要用递归来做,这样需要补断的函数压栈,速度慢,也耗资源,用一个堆栈来保存你的临时信息,处理函数每次从栈顶取得数据进行处理,处理完的数据退栈,这样应该会好点,

还有内存管理,可以自己预先声请一个足够大的内存,然后自己写函数负责从这块区域内分配内存和释放内存,在实际代码中就用这些函数来取得内存。。。。因为delphi中的new,getmem等函数,在分配万内存后释放似乎有点延时,而且较容易产生内存碎片,所以如果你每次声请的内存大小基本固定,还是自己出来好。可以避免内存的无限制增长。

ZyxIp 2003-08-22
  • 打赏
  • 举报
回复
我不用动态数组,不用@ 也不用^ 。除非调用API时迫不得已才用。


将数据保存到自己定义的类中,保存到TList的DATA中。

然后在用类封装。





livin 2003-08-22
  • 打赏
  • 举报
回复
溢出溢出!!!高手帮我看看吧

var
tempstream:Tfilestream;
ta,tb,streamlen,i,j:integer;
streambuff:array of char;
pbuff:Pchar;
tempbuff:Pchar;
tempfilename:string;
onecount:integer;
begin
tempfilename:='d:\crypttext';
tempstream:=Tfilestream.Create(tempfilename,fmopenread);
streamlen:=tempstream.Size*8;
setlength(streambuff,(streamlen div 8)+1);
tempstream.Position :=0;
tempstream.Read(streambuff[0],streamlen div 8);
tempstream.Destroy ;
ta:=128
for i:=1 to 50 do
begin
edit1.Text:=inttostr(i);
edit1.Refresh;
tb:=streamlen div ta;
for j:=0 to tb-1 do
begin
tempbuff:=nil;
tempbuff:=@streambuff[j*(ta div 8)];
StreamFreqTestBlock(tempbuff,ta,@onecount);
end;
end;
end;

其中StreamFreqTestBlock()是我调用的别人的vc dll中的一个函数
函数原型
void StreamFreqTestBlock(char *StreamBuf,int StreamLen,int *OneCount)
{int n1,n,buf_order;
char StreamByte,TempByte;
int i;
n1=n=buf_order=0;
do
{StreamByte=StreamBuf[buf_order];
buf_order++;
for (i=0;i<8;i++)
{TempByte=StreamByte&128;
if (TempByte)
n1++;
StreamByte<<=1;
n++;
if (n==StreamLen) goto testend;
}

}
while (1);
testend:
*OneCount=n1;
return;
}

livin 2003-08-22
  • 打赏
  • 举报
回复
郁闷
没人说点什么吗?
lxpbuaa 2003-08-22
  • 打赏
  • 举报
回复
说错了一点:
动态数组 := nil;
可以释放该数组。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
livin 2003-08-22
  • 打赏
  • 举报
回复
多谢了
lxpbuaa 2003-08-22
  • 打赏
  • 举报
回复
可能是那个dll写的有些问题,其他的就不太清楚了。我对c/c++不在行 :》

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
livin 2003-08-22
  • 打赏
  • 举报
回复
调用lxpbuaa的这个函数没错,能不能分析一下什么原因呢?多谢
livin 2003-08-21
  • 打赏
  • 举报
回复
呵呵,被 lxpbuaa说的脸都红了

那个函数师我调用别人用vc写的函数。参数三个:输入为strtoint(hzxpslen_edit.text) 长的数组,返回值是strtoint(hzxpslen_edit.text) 的blockdata

要看源代码嘛? 需要的话我找找。哥哥姐姐帮帮我吧
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
看你这代码写的,strtoint(hzxpslen_edit.Text) 也该首先用个变量保存起来吧,每次都调用strtoint。这个先不说了,关键代码StreamFreqTestBlockVertical呢?它是干什么的?

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
livin 2003-08-21
  • 打赏
  • 举报
回复
for r:=0 to keytime do
begin

setlength(blockdata,strtoint(hzxpslen_edit.text)+1);//一般128
pblockdata:=@blockdata[0];
for j:=0 to strtoint(hzxpslen_edit.text) do
blockdata[j]:=0;
for j:=0 to ta-1 do////ta 为3000多
begin
tempbuff:=@streambuff[j*(strtoint(hzxpslen_edit.Text )div 8)];
StreamFreqTestBlockVertical(tempbuff,strtoint(hzxpslen_edit.text) ,pblockdata);
end;
end;
其中keytime超过22时溢出。
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
你最好把相关的代码铁出来大家帮你看看

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
livin 2003-08-21
  • 打赏
  • 举报
回复
该怎么解决呢?的确我反复调用调用了一个函数,StreamFreqTestBlock(StreamBuf:pchar, StreamLen:integer,OneCount:pinteger);问题是调用22次没问题,多于22次就会溢出。
madyak 2003-08-21
  • 打赏
  • 举报
回复
在函数或过程内部使用了大数组;以及占用较大内存空间的变量,以数值方式做为参数传递时,常会引起堆栈的溢出
livin 2003-08-21
  • 打赏
  • 举报
回复
哎,真是郁闷。我也觉得delphi可以自己管理动态数组的。还有什么别的原因会引起堆栈的溢出呢?(不是死循环)
madyak 2003-08-21
  • 打赏
  • 举报
回复
一般有两种手段相结合:
1.在IDE中Project->Options->Linker页中Memeory Size下的数值往大里改
2.把占用空间的变量改为全局变量!
为防止全局变量,太多引起混乱,
也可以改为单元内部的全局变量 如下:
implementation
var
.....
Drate 2003-08-21
  • 打赏
  • 举报
回复
我也碰到过这样的问题
呵呵,忙活了好一会,才发现进入了死循环
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
setlength(dataarray,i);
.....
setlength(dataarray,0);


dataarray:=nil只是将指针置为nil。
不过动态数组的内存是自动管理的,有可能是别的代码有问题。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧