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

急C语言内存使用疑难,何时new不是有关问题,何时delete才是难点

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

急,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; } 

热点排行