首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个被调用函数执行完了,在return之后发生了内存异常,是咋回事啊

2013-10-01 
一个被调用函数执行完了,在return之后发生了内存错误,是怎么回事啊?函数执行完了,在返回的过程中发生了错

一个被调用函数执行完了,在return之后发生了内存错误,是怎么回事啊?
函数执行完了,在返回的过程中发生了错误,郁闷,这是什么错误?返回也能发生错误?

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
大神门能不能解释一下,在什么情况下,函数运行完了,在放回的时候出错呢? 内存 c++ shared_ptr
[解决办法]
计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。)

热点排行