读书人

急C语言内存使用疑难何时new不是有关

发布时间: 2012-08-25 10:06:20 作者: rapoo

急,C语言内存使用疑难,何时new不是问题,何时delete才是难点。
#include "stdafx.h"
#include "stdio.h"
#include "string.h"

#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>

//#include "debug_new.h"

void Merge(int* In,int* Out,int i,int m,int n)
{//将有序的In[i..m]和In[m+1..n]归并为有序的Out[i..n]
int j,k;
for(j=m+1,k=i;i<=m && j<=n;++k)
{
if(In[i] < In[j])
Out[k] = In[i++];
else
Out[k] = In[j++];
}
// if(i<=m) Out[k..n] = In[i..m];
if(i<=m)
{
while(k<=n)
{
Out[k] = In[i];
k++;
i++;
}
}
// if(j<=n) Out[k..n] = In[j..n];
if(j<=n)
{
while(k<=n)
{
Out[k] = In[j];
k++;
j++;
}
}
}

int* MSort(int* In,int* Out1,int s,int t)
{//将In[s..t]归并排序为Out1[s..t]
int m;
//int Out2[10];
int* Out2 = NULL;
Out2 = (int*)malloc(t*sizeof(int));
//int* Out2 = (int*)malloc(1);
if(Out2 == NULL)
return Out2;//分配内存失败
if(s == t)
{
Out1[s] = In[s];
//free(Out2);
}
else
{
m = (s+t)/2;//将In[s..t]平分为In[s..m]和In[m+1..t]
MSort(In,Out2,s,m);//递归In[s..m]归并为有序的Out2[s..m]
MSort(In,Out2,m+1,t);//递归In[m+1..t]归并为有序的Out2[m+1..t]
Merge(Out2,Out1,s,m,t); //将Out2[s..m]和Out2[m+1..t]归并到Out1[s..t]
}
return Out2;
}

int main(int argc, char* argv[])
{
_CrtMemState s1, s2, s3; // 声明内存状态结构变量
_CrtMemCheckpoint( &s1 );// 获取第一个内存状态快照

int in[]= {2,6,45,7,79,32,5,12,15,25};
int out[10];
memset(out,0,10*sizeof(int));
MSort(in,out,0,9);
for(int i=0;i<10;i++)
printf("%d ",out[i]);
printf("\n");

_CrtMemCheckpoint( &s2 );// 获取第二个内存状态快照
// 比较两个内存快照的差异
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );// dump 差异结果
// 输出内存泄漏报告,显示在 Output 窗口的 Debug 页中
_CrtDumpMemoryLeaks();
return 0;
}
上面的程序,是用对整型数组in的归并排序处理。在函数MSort中,有这行代码:
Out2 = (int*)malloc(t*sizeof(int));分配了堆内存,但是我不知道在何处添加free语句才能正确的释放内存
我已经试过很多地方了,都是要么不能完全释放掉已经分配的内存,要么是程序得不得运行结果,难道在这里分配了内存后,就不可能在释放掉已经分配的堆内存了?请各位高手指点一下。

[解决办法]
呵呵!这段的代码还是有用得着的时候啊!楼主可以去看看!把那几个函数添加到你的代码里面就应该没问题呢!
http://blog.csdn.net/CSYNYK/archive/2008/09/01/2861979.aspx
[解决办法]
http://download.csdn.net/source/403514

归并排序这里有!Ni看看~
[解决办法]
噢!忘了!应该还要增加一个判断,要不然递归的最后一级会出错!

C/C++ code
int* MSort(int* In,int* Out1,int s,int t){                            int m;    int* Out2 = NULL;    int *tmp1=NULL, *tmp2=NULL;            //增加两个临时指针变量用于接收递归调用的返回值    Out2 = (int*)malloc(t*sizeof(int));    if(Out2 == NULL)        return Out2; //分配内存失败    if(s == t)           Out1[s] = In[s];    else    {        m = (s+t)/2;         tmp1=MSort(In,Out2,s,m);   //接收下一级递归返回来的地址        tmp2=MSort(In,Out2,m+1,t);         Merge(Out2,Out1,s,m,t);     }    if(tmp1!=NULL)         //判断是否分配了内存           free(tmp1);     //释下一级递归放返回来的空间    if(tmp2!=NULL)           free(tmp2);    return out2;         //递归调用最开始一级的OUT2就要在主函数中去释放了。}
------解决方案--------------------


把资源分配封装到一个类中,使用析构函数进行释放,这样就不用到处检测哪里要自己释放了.
[解决办法]

C/C++ code
//改了下代码,这么写肯定不会内存泄漏,有些问题既然不必要,又不好解决,就尽量避免啊^_^#include "stdio.h" #include "string.h" #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> void Merge(int a[],int low,int middle,int high){    int h,i,j,k;    int b[10];    h=low;    i=low;    j=middle+1;        while(h<=middle&&j<=high)    {        if(a[h]<=a[j])        {            b[i]=a[h];            h++;        }        else        {             b[i]=a[j];            j++;        }        i++;    }    if(h>middle)        for(k=j;k<=high;k++)        {            b[i]=a[k];            i++;         }        else        {            for(k=h;k<=middle;k++)            {                 b[i]=a[k];                i++;            }        }        for(k=low;k<=high;k++)        {            a[k]=b[k];        }}int MSort(int* In,int low,int high) {//将In[s..t]自身归并排序    int middle;    if (low<high)     {         middle= (low+high)/2; //将In[s..t]平分为In[s..m]和In[m+1..t]         MSort(In,low,middle); //递归In[s..m]归并为有序的Out2[s..m]         MSort(In,middle+1,high); //递归In[m+1..t]归并为有序的Out2[m+1..t]         Merge(In,low,middle,high); //将Out2[s..m]和Out2[m+1..t]归并到Out1[s..t]     }    return 0;} int main(int argc, char* argv[]) {             _CrtMemState s1, s2, s3; // 声明内存状态结构变量     _CrtMemCheckpoint( &s1 );// 获取第一个内存状态快照         int in[]= {2,6,45,7,79,32,5,12,15,25};     MSort(in,0,9);     for(int i=0;i <10;i++)         printf("%d ",in[i]);     printf("\n");         _CrtMemCheckpoint( &s2 );// 获取第二个内存状态快照     // 比较两个内存快照的差异     if ( _CrtMemDifference( &s3, &s1, &s2) )         _CrtMemDumpStatistics( &s3 );// dump 差异结果     // 输出内存泄漏报告,显示在 Output 窗口的 Debug 页中     _CrtDumpMemoryLeaks();     return 0; } 

读书人网 >C语言

热点推荐