| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1651 人关注过本帖
标题:不知道错在哪 应该是释放看空间出错 用的编译器是vs2012 折磨死我了单步可 ...
只看楼主 加入收藏
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
结帖率:81.82%
收藏
已结贴  问题点数:50 回复次数:9 
不知道错在哪 应该是释放看空间出错 用的编译器是vs2012 折磨死我了单步可以走一调试就出错
应该是 释放内存的错误  就是一直检查不出来;
错误截图
图片附件: 游客没有浏览图片的权限,请 登录注册

这个是报错的地点有时显示
void __cdecl _free_base (void * pBlock)
{

        int retval = 0;


        if (pBlock == NULL)
            return;

        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));

        retval = HeapFree(_crtheap, 0, pBlock);
        if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}


有时显示
/***
*int _CrtDoForAllClientObjects() - call a client-supplied function for all
*                                  client objects in the heap
*
*Purpose:
*       call a client-supplied function for all client objects in the heap
*
*Entry:
*       void (*pfn)(void *, void *) - pointer to client function to call
*       void * pContext - pointer to user supplied context to pass to function
*
*Return:
*    void
*
*Exceptions:
*   Input parameters are validated. Refer to the validation section of the function.
*
*******************************************************************************/
extern "C" _CRTIMP void __cdecl _CrtDoForAllClientObjects(
        void (*pfn)(void *, void *),
        void * pContext
        )
{
        _CrtMemBlockHeader * pHead;

        /* validation section */
        _VALIDATE_RETURN_VOID(pfn != NULL, EINVAL);

        if (!(_crtDbgFlag & _CRTDBG_ALLOC_MEM_DF))
            return;         /* sorry not enabled */

        _mlock(_HEAP_LOCK);  /* block other threads */
        __try {
                        for (pHead = _pFirstBlock; pHead != NULL; pHead = pHead->pBlockHeaderNext)
                        {
                                if (_BLOCK_TYPE(pHead->nBlockUse) == _CLIENT_BLOCK)
                                        (*pfn)((void *) pbData(pHead), pContext);
                        }
        }
        __finally {
            _munlock(_HEAP_LOCK);  /* release other threads */
        }
}
程序代码:
void  group_compitition(Group_inform &group,Graph *g)
{
    int i,j;
    double *probability_gap;//生成概率梯度
    double *choice;         //存放选择评判的数据
    int *lable;             //存放被选择个体的标号
    int **family_tempt;

    srand((unsigned) time(NULL));

    family_tempt=(int**)malloc(group_num*sizeof(int*));
    for(i=0;i<group_num;i++)
        family_tempt[i]=(int*)malloc(g->vertex_num*sizeof(int));

    probability_gap=(double*)malloc(g->edge_num*sizeof(double));
   
    choice=(double*)malloc(group_num*sizeof(double));
    lable=(int*)malloc(group_num*sizeof(int));
    memset(choice,0,sizeof(choice));
/*
.................................................生成适应度梯度;
*/
    probability_gap[0]=group.probability[0];
    for(i=1;i<group_num;i++)
    {
        probability_gap[i]=probability_gap[i-1]+group.probability[i];
    }
/*
.................................................确定哪些成员生存,
*/
    for(i=0;i<group_num;i++)
        choice[i]=rand()%100/100.0;
    for(i=0;i<group_num;i++)
    {
        for(j=0;j<group_num;j++)
            if(choice[i]<=probability_gap[j])
                break;
        lable[i]=j;
    }
    for(i=0;i<group_num;i++)
    {
        printf("%d    ",lable[i]);
        if(i%10==0)
            printf("\n");
    }
/*
...........................................使优良个体得以壮大不好的个体淘汰
*/
    for(i=0;i<group_num;i++)
        for(j=0;j<g->vertex_num;j++)
            family_tempt[i][j]=group.group_family[i][j];
    for(i=0;i<group_num;i++)
    {
        printf("family:\n");
        for(j=0;j<g->vertex_num;j++)
        {
            printf("  %d",family_tempt[i][j]);
        }
        printf("\ngroup:\n");
        for(j=0;j<g->vertex_num;j++)
        {
            printf("  %d",group.group_family[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<group_num;i++)
    {
        for(j=0;j<g->vertex_num;j++)
            group.group_family[i][j]=family_tempt[lable[i]][j];
    }
    free(lable);
    free(choice);
    free(probability_gap);
    for(i=0;i<group_num;i++)
        free(family_tempt[i]);
    free(family_tempt);
}
搜索更多相关主题的帖子: 编译器 return 空间 
2015-04-05 16:53
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
这要把释放空间语句屏蔽掉就可以执行   哪些语句为什么错     坐等大神救命!!!
2015-04-05 20:14
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 2楼 风车转风车89
只要把释放空间函数屏蔽掉就不会报错   这是为什么
2015-04-06 10:05
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
你是不是重复释放同一块内存?

一片落叶掉进了回忆的流年。
2015-04-06 11:24
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:50 
for(i=0;i<group_num;i++)
        free(family_tempt[i]);
    free(family_tempt);//这里又释放了一次tempt[0]

一片落叶掉进了回忆的流年。
2015-04-06 11:25
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 5楼 诸葛欧阳
奥 应该是您说的那样,假如直接释放 delete family_tempt;二阶指针,一节指针的空间是不是买没有释放
2015-04-06 11:39
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 5楼 诸葛欧阳
我把下面那句删掉还是不行
2015-04-06 15:19
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
family_tempt=(int**)malloc(group_num*sizeof(int*));
    for(i=0;i<group_num;i++)
        family_tempt[i]=(int*)malloc(g->vertex_num*sizeof(int));
如果你想申请一个数组那么多的指针的话第一句没必要,你只需在第二句之前定义一个指针数组,然后分别让每个数组成员指向一块内存

一片落叶掉进了回忆的流年。
2015-04-06 16:13
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 8楼 诸葛欧阳
  我改过来了  这样好使 谢谢版主!函数调用是以堆栈的形式,在函数调用结束后为函数开辟的内存是不是都要释放掉?不过每一个函数都有入口一个地址,函数指针才可以指向他来调用函数,怎么理解?
2015-04-06 16:31
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 8楼 诸葛欧阳
刚开始用二阶指针是因为要开辟的指针个数是个变量 因此采用动态分配内存的方法
2015-04-06 16:34
快速回复:不知道错在哪 应该是释放看空间出错 用的编译器是vs2012 折磨死我了单 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035944 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved