vector自析构出错,求助,速度送分给您。

lz_26 2010-01-11 10:15:28
各位,我用遗传算法求解一个问题,运行到一定程度的时候总会出错,谁能帮帮我啊?

在一个类中含有两个vector,CraneTask是一个结构体。如下

class CModel
{
……
vector<CraneTask> RealCRTask;
vector<CraneTask> TempCRTask;
……
}
每次迭代的时候,这个类要构造,计算出结果,然后析构。下一次再构造,计算,析构。
问题是运算一定时间后,就出错!
信息如下HEAP[AIS_A.exe]: HEAP: Free Heap block 85a5fd0 modified at 85a98cc after it was freed
Windows 已在 AIS_A.exe 中触发一个断点。

其原因可能是堆被损坏,这也说明 AIS_A.exe 中或它所加载的任何 DLL 中有 bug。


堆栈如下:
ntdll.dll!7c92120e()
[下面的框架可能不正确和/或缺失,没有为 ntdll.dll 加载符号]
ntdll.dll!7c98e191()
ntdll.dll!7c96b0fa()
ntdll.dll!7c9470df()
ntdll.dll!7c97f39c()
ntdll.dll!7c98f8b2()
AIS_A.exe!std::allocator<_Crane_Task>::destroy(_Crane_Task * _Ptr=0x085ad8c4) 行161 + 0x9 字节 C++
AIS_A.exe!std::_Destroy_range<_Crane_Task,std::allocator<_Crane_Task> >(_Crane_Task * _First=0x7c982438, _Crane_Task * _Last=0x003b0608, std::allocator<_Crane_Task> & _Al={...}, std::_Nonscalar_ptr_iterator_tag __formal={...}) 行235 + 0xc 字节 C++
ntdll.dll!7c982340()
msvcr80d.dll!_free_base(void * pBlock=0x085aa578) 行109 + 0x13 字节 C
msvcr80d.dll!_free_dbg_nolock(void * pUserData=0x085aa598, int nBlockUse=1) 行1329 + 0x9 字节 C++
msvcr80d.dll!_free_dbg(void * pUserData=0x085aa598, int nBlockUse=1) 行1194 + 0xd 字节 C++
mfc80d.dll!operator delete(void * p=0x085aa598) 行373 + 0xc 字节 C++
AIS_A.exe!std::allocator<_Crane_Task>::deallocate(_Crane_Task * _Ptr=0x085aa598, unsigned int __formal=159) 行141 + 0x9 字节 C++
AIS_A.exe!std::vector<_Crane_Task,std::allocator<_Crane_Task> >::_Tidy() 行1098 C++
AIS_A.exe!std::vector<_Crane_Task,std::allocator<_Crane_Task> >::~vector<_Crane_Task,std::allocator<_Crane_Task> >() 行547 C++
> AIS_A.exe!CModel::~CModel() 行101 + 0xe 字节 C++
AIS_A.exe!CModel::`scalar deleting destructor'() + 0x2b 字节 C++
AIS_A.exe!CAIA::CalculatePopulationsAffinity() 行221 + 0x34 字节 C++
AIS_A.exe!CAIA::CalculatePopulationsSelIndex() 行239 + 0x8 字节 C++
AIS_A.exe!CAIA::Epoch() 行451 C++
AIS_A.exe!CParaSelDlg::OnBnClickedGettask() 行68 C++


自己跟踪,发现在AIS_A.exe!CModel::~CModel()析构的时候出错,此时TempCRTask[132]中所有制都置零了,但是容量还是132,我觉得正确的应该是TempCRTask[0],而RealCRTask[71]数据还是好的。也就是说,错误可能在于类析构的时候,TempCRTask自析构时,数据清零,但资源未释放成功,RealCRTask则为轮到它自析构。

我不知道我分析的对不对,这个问题该如何解决啊,谢谢各位,这是我的毕业课题,比较急。
...全文
840 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pady_pady 2010-01-11
  • 打赏
  • 举报
回复
我想是CraneTask析构有问题,不知道你是放在CModel里还是在CraneTask自己处理的,把delete CraneTask的位置找出来就好了
lz_26 2010-01-11
  • 打赏
  • 举报
回复
vector肯定是没问题的,我就是觉得什么BUG导致vector不能正常工作。
会不会是因为我频繁的NEW,DELETE类对象呢?[Quote=引用 6 楼 pady_pady 的回复:]
居然会有人怀疑是vector的问题,呵呵
想想也是CModel里面越界访问了,或者是CranTask的析构有问题
[/Quote]
pady_pady 2010-01-11
  • 打赏
  • 举报
回复
居然会有人怀疑是vector的问题,呵呵
想想也是CModel里面越界访问了,或者是CranTask的析构有问题
yshuise 2010-01-11
  • 打赏
  • 举报
回复
vector是自己管理内存的。
=======
~vector会调用你自己写的析构。
lz_26 2010-01-11
  • 打赏
  • 举报
回复
谢谢这位朋友,编译器是VS2005,CraneTask是个结构体,vector是自己管理内存的。[Quote=引用 2 楼 yshuise 的回复:]
第一:是不是编译器太老了。
第二:CraneTask的析构一定要写好。
[/Quote]
lz_26 2010-01-11
  • 打赏
  • 举报
回复
楼上的朋友,代码太多,循环就是下面的。
for (int i=0; i<m_iPopSize; ++i)
{
CModel *pCRMO = new CModel(4,RealCraneTask,m_vecPopulation[i].vecSchedule);
int simResult = pCRMO->RunModel();
delete pCRMO;
}
麻烦看一下
yshuise 2010-01-11
  • 打赏
  • 举报
回复
第一:是不是编译器太老了。
第二:CraneTask的析构一定要写好。
taodm 2010-01-11
  • 打赏
  • 举报
回复
无完整代码,无真相。
你不如先google “提问的智慧”吧,否则你的分析基本是给找原因添乱。
tyc139 2010-01-11
  • 打赏
  • 举报
回复
6楼有道理,很可能是越界,这个问题出现的概率比较大。
wangchentangjuan 2010-01-11
  • 打赏
  • 举报
回复
析构函数失败
mfczinux 2010-01-11
  • 打赏
  • 举报
回复
把析构函数贴出来吧

64,643

社区成员

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

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