程序运行时遭遇内存不足的问题,附有代码

anuosix 2008-11-09 01:39:52
程序运行到最后弹出一个消息框,只有四个字“内存不足”,主要是出现在下边这个函数里边,麻烦大家看看怎么回事,是什么原因导致的,谢谢!
代码如下

void CwebBlogDlg::proExpansion2(Graph &g,int iTblNum)
{
srand(time(NULL));
typedef std::set<int>::iterator IntIter;
typedef std::pair<IntIter,bool> PairIntIterBool;
IntIter iIter;
PairIntIterBool prIIterBool;
while (boost::num_edges(g)!=0)
{
int iGraphEdgeNum=boost::num_edges(g);
bool bCanJoinInSociety=true;
int iRandNum=rand()%iGraphEdgeNum;


PtrVtxVtr vtrVtxSourceAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxTargetAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxIntersect(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrSociety(new std::vector<VertexDescriptor>);
mt19937 gen(time(0));
EdgeDescriptor eDescriptor;
//选用随机边或者最多邻接点边
if (this->m_enumActModeSel==randomEdge)
{
eDescriptor=this->getEdgeWithRandom(g);
m_strModeRandMax="self random edge";
}
else
{
eDescriptor=this->getEdgeWithMostAdj(g);
m_strModeRandMax="most Adj Edge";
}
VertexDescriptor vtxSource=boost::source(eDescriptor,*m_gphSglEdge);
VertexDescriptor vtxTarget=boost::target(eDescriptor,*m_gphSglEdge);
vtrSociety->push_back(vtxSource);
vtrSociety->push_back(vtxTarget);

std::pair<AdjIter,AdjIter> prAdjIter;
for (prAdjIter=boost::adjacent_vertices(vtxSource,*m_gphSglEdge);prAdjIter.first!=prAdjIter.second;prAdjIter.first++)
{
vtrVtxSourceAdj->push_back(*prAdjIter.first);
}
for (prAdjIter=boost::adjacent_vertices(vtxTarget,*m_gphSglEdge);prAdjIter.first!=prAdjIter.second;prAdjIter.first++)
{
vtrVtxTargetAdj->push_back(*prAdjIter.first);
}
vtrVtxIntersect=CGlbFunc::getVectorIntersect(vtrVtxSourceAdj,vtrVtxTargetAdj);
int iIntersectSetSize=vtrVtxIntersect->size();
if (iIntersectSetSize>0)//四个三角形连接在一个四边形的四个顶点上的情况,此时有可能不产生任何社区
{
int iRandIntersectSetNum=rand()%iIntersectSetSize;
this->bJoinTheSosiety((*vtrVtxIntersect)[iRandIntersectSetNum],vtrSociety,*m_gphSglEdge);
if (vtrSociety->size()<boost::num_edges(*m_gphSglEdge))
{
bCanJoinInSociety=true;
}
else
{
bCanJoinInSociety=false;
}
while (bCanJoinInSociety==true)
{
VertexDescriptor vtxToJoin=this->getVtxToJoinSociety(vtrSociety,*m_gphSglEdge);
bCanJoinInSociety=this->bJoinTheSosiety(vtxToJoin,vtrSociety,*m_gphSglEdge);
}
for (int i=0;i<vtrSociety->size();i++)
{
boost::clear_vertex((*vtrSociety)[i],*m_gphSglEdge);
}
this->m_vtrCommunities.push_back(vtrSociety);

}
else
{
if (vtrSociety->size()>=3)
{
this->m_vtrCommunities.push_back(vtrSociety);
}
for (int i=0;i<vtrSociety->size();i++)
{
boost::remove_edge(vtxSource,vtxTarget,g);
//boost::clear_vertex(vtrSociety[i],m_gphSglEdge);//此处不能清除顶点,而只能清除边
}

}
}
this->m_dwProcTime=GetTickCount()-this->m_dwProcTime;
this->m_dwProExpansionTime=this->m_dwProExpansionTime+(GetTickCount()-dwProExpStart);
this->outputToFile(this->m_vtrCommunities,iTblNum);
}

...全文
517 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hefeng1000 2008-11-11
  • 打赏
  • 举报
回复
看看是不是你的数组分配的不够;我以前也到一个数据少分配一个,运行后也是提示内存不足!
anuosix 2008-11-11
  • 打赏
  • 举报
回复
我下载了purify,但是如何来分析呢
看到运行结果有些memory leaks,但都是dll中的泄漏,跟我没有关系吧
anuosix 2008-11-11
  • 打赏
  • 举报
回复
弟兄们,问题没有解决阿,怎么办呢,还是会内存不足
大家遇到这种问题通常怎么处理呢
我现在已经把所有的指针都不用了,应该不会泄漏了吧,但是还是内存不足
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xxgamexx 的回复:]
1,添加一些代码,让程序及时输出一些内存信息呢? 看看是否是预期的效果

2,智能指针应该是在作用域尾部释放空间。[/Quote]

呵呵,我也比较赞同这个说法

如果非必须


PtrVtxVtr vtrVtxSourceAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxTargetAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxIntersect(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrSociety(new std::vector<VertexDescriptor>);

拿到while外面看看

如果可以,那你的问题就知道了

或者你直接trace一下么,如果你用的IDE方便的话。


liuhaoran 2008-11-10
  • 打赏
  • 举报
回复
不过LZ你的智能指针感觉用错地方了,你那个不用智能指针也一样自动释放的,,,,,,,,智能指针不象是用在这个地方的把
taodm 2008-11-10
  • 打赏
  • 举报
回复
楼主啊,你还是别用boost里的东西了吧,自己写吧。
xxgamexx 2008-11-10
  • 打赏
  • 举报
回复
1,添加一些代码,让程序及时输出一些内存信息呢? 看看是否是预期的效果

2,智能指针应该是在作用域尾部释放空间。
anuosix 2008-11-10
  • 打赏
  • 举报
回复
智能指针应该是可以自己释放的吧
liuhaoran 2008-11-09
  • 打赏
  • 举报
回复
呵呵,突然看到LZ说用了智能指针boost::shared_ptr,对这个不熟悉= =,,不考虑我问题,
zjljqlbtx 2008-11-09
  • 打赏
  • 举报
回复
循环后释放试下?
liuhaoran 2008-11-09
  • 打赏
  • 举报
回复
呵呵,,,这样好象看不出什么问题,LZ写这些程序的时候没有在里面写日志的习惯吗?特别是你这些内存错误,用日志比较容易看的出在哪里出问题...........
...提点其他的建议:
while等循环语句里面最好是别定义,特别是类对象这些,不然老是构造,析构的话,内存很容易出问题的,最好是统一放在外面.

....还有那个这样的bCanJoinInSociety==true判断条件,= =看起来很怪,,直接写bCanJoinInSociety判断不就可以了吗?
....另外有个,呵呵,最好是这样写:
while()
{




}//while ---比较长的while,一个屏幕看不完的最好加个后面这样的,这样可以让读你代码的人感觉这个就是while的结束,,,


最后发现你这里有个地方怪的...好象没有释放内存啊
PtrVtxVtr vtrVtxSourceAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxTargetAdj(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrVtxIntersect(new std::vector<VertexDescriptor>);
PtrVtxVtr vtrSociety(new std::vector<VertexDescriptor>);

你每次循环,,好象没有释放,(我不清楚你这个程序是故意不释放,还是遗漏的),,,,,,,,,,,,
,,,,,,或许你其他函数里释放了?--这个只是猜想,呵呵,猜错了别怪!= =
lzh9955 2008-11-09
  • 打赏
  • 举报
回复
期待!!!!!!
镜机 2008-11-09
  • 打赏
  • 举报
回复
up!
anuosix 2008-11-09
  • 打赏
  • 举报
回复
使用了智能指针,内存泄漏可能发生在哪里呢
anuosix 2008-11-09
  • 打赏
  • 举报
回复
任务管理器是显示占用很大的内存尤其是虚拟内存更大,甚至达到一个g
如果是碎片应该如何调整分配策略呢
睡在床板下_ 2008-11-09
  • 打赏
  • 举报
回复
可能是程序其他地方出现的,导致这里异常。

提示不足,只要从泄漏和内存碎片着手
如果是泄漏,看任务管理器就可以看出来了,如果是碎片,就整理下你的内存分配策略吧
Longinc 2008-11-09
  • 打赏
  • 举报
回复
UP
freshairfly 2008-11-09
  • 打赏
  • 举报
回复
算法里用到了随机数,然后一直会向容器里push东西,所以运行一段时间看看几个容器,里面元素的个数是不是远远超出你的预期
lzp765 2008-11-09
  • 打赏
  • 举报
回复
开辟空间应该可以开很多吧~~~~~~~~~~~
anuosix 2008-11-09
  • 打赏
  • 举报
回复
谢谢大家,怎么没有人给点意见呢,大家帮帮忙,看看程序问题出在哪里,主要看看代码就行了,我就想知道代码本身还有什么地方可以改进,算法应该是没有什么问题的,也是必须这样做的
加载更多回复(4)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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