一个被调用函数执行完了,在return之后发生了内存错误,是怎么回事啊?

jack_leiwin 2013-09-17 10:42:34
函数执行完了,在返回的过程中发生了错误,郁闷,这是什么错误?返回也能发生错误?
void CMVPIndex::parallelLoadLeafToRoot(vector<shared_ptr<CIndexObject> >&dataObject)
{

ofstream out(fileName,ios::in|ios::out|ios::binary);
out.close();

filePointer=0;//the pointer of file

HANDLE tHandle;

vector<shared_ptr<Task> > newTaskList;
vector<shared_ptr<Task> > rootTask;

mutexA=CreateMutex(NULL,0,NULL);
mutexB=CreateMutex(NULL,0,NULL);
mutexO=CreateMutex(NULL,0,NULL);

if(dataObject.size()<=maxLeafSize)
rootAddress=-2;
else
rootAddress=-1;


shared_ptr<Task> task(new Task(dataObject,NULL,0,dataObject.size(),0,0));

//这儿用的事只能指针,莫非是只能指针释放内存时候出错?

this->taskList.push_back(task);

parallelBlock pba;
{
pba.fstr=&out;
pba.numPivots=&(this->numPivots);
pba.metric=this->metric;
pba.maxLeafSize=this->maxLeafSize;
pba.taskList=&(this->taskList);
pba.newTaskList=&newTaskList;
pba.pm=this->pm;
pba.psm=this->psm;
pba.singlePivotFanout=this->singlePivotFanout;
pba.numInternalNode=&(this->numInternalNodes);
pba.numLeafNode=&(this->numLeaf);
pba.fileName=this->fileName;
pba.filePointer=&(this->filePointer);
pba.rootAddress=&(this->rootAddress);

}

while(this->taskList.size()>0||threadANum>0)
{

if(this->taskList.size()>threadANum&&threadANum<3)
{
threadANum++;
tHandle=CreateThread(NULL,0,threadOfCreateInternalOrLeafNode,&pba,0,NULL);
CloseHandle(tHandle);
}
else
{
Sleep(2000);
}

}

while(this->taskList.size()>0||newTaskList.size()==0)
Sleep(5000);

parallelBlock pbb;
{
pbb.fstr=&out;
pbb.numPivots=&(this->numPivots);
pbb.metric=this->metric;
pbb.maxLeafSize=this->maxLeafSize;
pbb.taskList=&(this->taskList);
pbb.newTaskList=&newTaskList;
pbb.pm=this->pm;
pbb.psm=this->psm;
pbb.singlePivotFanout=this->singlePivotFanout;
pbb.numInternalNode=&(this->numInternalNodes);
pbb.numLeafNode=&(this->numLeaf);
pbb.fileName=this->fileName;
pbb.filePointer=&(this->filePointer);
pbb.rootAddress=&(this->rootAddress);

pbb.rootTask=NULL;
}

while(pbb.newTaskList->size()>0||threadBNum>0)
{
if(pbb.newTaskList->size()>threadBNum&&threadBNum<3)
{
threadBNum++;
tHandle=CreateThread(NULL,0,threadOfWriteInternal,&pbb,0,NULL);
CloseHandle(tHandle);
}
else
{
Sleep(2000);
}
}

while(pbb.newTaskList->size()>0||threadBNum>0||this->taskList.size()>0||threadANum>0)
Sleep(5000);

writeRoot(pbb.rootTask,out);

}


在VS2012下debug,会弹出出现错的地方,所在文件是memory.h
大神门能不能解释一下,在什么情况下,函数运行完了,在放回的时候出错呢?
...全文
607 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-29
  • 打赏
  • 举报
回复
下载c:\windows\syswow64\kernel32.dll对应符号文件wkernel32.pdb。 或 Change Symbol Settings...
jack_leiwin 2013-09-22
  • 打赏
  • 举报
回复
算了!
jack_leiwin 2013-09-21
  • 打赏
  • 举报
回复
有木有人知道8楼的那个关于vs2012的问题啊?
jack_leiwin 2013-09-20
  • 打赏
  • 举报
回复
有木有人知道8楼的那个关于vs2012的问题啊?
max_min_ 2013-09-18
  • 打赏
  • 举报
回复
什么错误? parallelBlock 是如何构造析构的呢?
ztenv 版主 2013-09-18
  • 打赏
  • 举报
回复
先不用智能指针试试,如果要使用则看看智通指针的注意事项、源码等; 我没有用过智能指针,自己技术还不到家。
jack_leiwin 2013-09-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。←这句话对识货者价值至少千金! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
学习....ing.....!
jack_leiwin 2013-09-18
  • 打赏
  • 举报
回复
对了,我在调试多线程的时候,vs2012总是跳出这个窗口,郁闷,这又是什么玩意儿?网上都没有关于这个的东西

漫步者、 2013-09-18
  • 打赏
  • 举报
回复
看下是不是指针没有初始化?
漫步者、 2013-09-18
  • 打赏
  • 举报
回复
vector<shared_ptr<CIndexObject> >&dataObject 你的这个shared 指针在你构造那个对象task时就析构掉了?
赵4老师 2013-09-18
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。←这句话对识货者价值至少千金! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
jack_leiwin 2013-09-18
  • 打赏
  • 举报
回复
1这是程序运行到了函数的最后



2下面是程序出错的地方

jack_leiwin 2013-09-18
  • 打赏
  • 举报
回复
引用
对象析构的时候发生问题了?

我不知道发生了什么错误,因为函数是在结束的时候发生的错误,所以我猜的事析构时候发生的错误,不过不知道是不是析构时候发生的错误,这个函数运行完了返回是出错还真是第一次见啊?这是什么情况啊?

怎么会发生这种错误?
healer_kx 2013-09-17
  • 打赏
  • 举报
回复
对象析构的时候发生问题了?

64,642

社区成员

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

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