堆栈溢出了,咋办?stack overflow

livin 2003-08-21 02:09:40
delphi程序堆栈溢出。怎么办?
申请的数组空间我已经作了释放了,难道这样不对?
setlength(dataarray,i);
.....
dataarray:=nil
...全文
318 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。
不过动态数组的内存是自动管理的,有可能是别的代码有问题。

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

1、课程简介          ElasticStack 是一系列开源产品的合集,包括 Elasticsearch、Kibana、Logstash 以及 Beats 等,能够安全可靠地获取任何来源、任何格式的数据,并且能够实时地对数据进行搜索、分析和可视化。其中,Logstash和Beats负责数据的收集,Kibana负责结果数据的可视化展现,Elasticsearch作为核心部分用于数据的分布式存储以及索引。   我们可以使用ElasticStack进行收集并处理任何数据,最为经典的是用于实时日志数据的收集、存储、展现。在此之前,如果实现实时日志的分析,需要经过繁琐的架构设计并且使用多个系统实现,现在只需要使用ElasticStack即可实现功能强大的实时日志分析系统,ElasticStack不仅仅用来做日志分析,它可以处理任何的数据并且进行存储、展现。          在本套课程中,我们将全面的讲解ElasticStack技术栈,从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用ElasticStack如何解决实际的问题,我们通过收集系统日志数据、服务器指标数据、nginx的运行数据等,多维度的展示了ElasticStack的应用范围,最终将分析的结果数据非常友好的展现出来,没错!不需要前端的参与也可以做出“高大上”的结果显示页。   2、适应人群   有一定的Java基础,并且要有一定的web开发基础。   3、课程亮点          系统的学习ElasticStack技术栈,掌握最先进的搜索、数据收集等技术。   l  Elasticsearch   n  快速入门   n  核心详解   n  中文分词   n  Elasticsearch集群   n  Java客户端的应用   l  Beats & Kibana & Logstash   n  Filebeat(文件采集器)   n  Metricbeat(指标采集器)   n  采集Nginx的日志以及指标数据   n  Kibana自定义仪表盘   n  Logstash自定义数据处理   l  综合练习   n  收集APP产生的日志进行实时展现   n  Filebeat采集日志   n  Logstash处理数据   n  Kibana 自定义仪表盘展现   4、主讲内容   章节一:Elasticsearch入门   1.     快速入门   2.     核心讲解   3.     中文分词   4.     全文搜索   5.     Elasticsearch集群   章节二:Beats   1.     Beats 简介   2.     Filebeat采集Nginx日志   3.     Metricbeat采集Nginx指标数据   章节三:Kibana   1.     Kibana简介   2.     Metricbeat 仪表盘   3.     Nginx 指标仪表盘   4.     Nginx 日志仪表盘   5.     自定义图表   章节四:Logstash   1.     Logstash简介   2.     配置详解   3.     读取自定义日志   章节五:综合练习   1.     流程说明   2.     Filebeat采集日志   3.     Logstash处理数据   4.     Kibana 自定义仪表盘展现

5,388

社区成员

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

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