对不起,在贴一次。
有关内存释放失败的问题。在exe中不能释放由dll申请的内存。高手请解答!我将fun1写在一个dll中,如下,(在项目实际当中int为一个复杂的结构,这里用int代替)__declspec( dllexport ) void fun1( int** ppintdata,long &RecordCount);
void fun1( int** ppintdata,long &RecordCount){            int* pintdata=NULL;
            
            int i;            RecordCount=12;
            
            pintdata= new int[RecordCount];
            
            for (i=0;i<12;i++)
            
            {
            
                        pintdata[i]=i+10;
                        
            }
            
            *ppintdata=pintdata;                        
            
}
然后在另外一个exe中调用,如下:__declspec( dllimport ) void fun1( int** ppintdata,long &RecordCount);void CTest16Dlg::OnButton2() {            int* pintdata;            
            
            long RecordCount;
            
            int intRecords;
            
            CString tmp;
                        fun1(&pintdata,RecordCount);
            
            for ( intRecords = 0;intRecords < RecordCount;intRecords++)
            
            {
            
                                    tmp.Format("%d,%d,\n",intRecords,pintdata[intRecords]);
                                    
                                    AfxMessageBox(tmp);
                                    
            }
            
            if (pintdata!=NULL)
            
            {
            
                        delete [] pintdata;
                        
                        pintdata=NULL;
                        
            }           
             
}当执行到delete [] pintdata;时失败,不能将内存删除。
如果我不用dll,直接调用,如下,则成功删除,最后pintdata=0x000;void fun1( int** ppintdata,long &RecordCount);void fun1( int** ppintdata,long &RecordCount){            int* pintdata=NULL;
            
            int i;
                        RecordCount=12;
            
            pintdata= new int[RecordCount];
            
            for (i=0;i<12;i++)
            
            {
            
                        pintdata[i]=i+10;
                        
            }
            
            *ppintdata=pintdata;                        
            
}
void main(){            int* pintdata;            
            
            long RecordCount;
            
            
            int intRecords;
            fun1(&pintdata,RecordCount);
            
            
            for ( intRecords = 0;intRecords < RecordCount;intRecords++)
            
            {
            
                                    printf("%d,%d,\n",intRecords,pintdata[intRecords]);
            
            }
            
            if (pintdata!=NULL)
            
            {
            
                        delete [] pintdata;
            
                        pintdata=NULL;
            
            }}问题总结:在exe中不能释放由dll申请的内存。高手请解答!

解决方案 »

  1.   

    从WINDOWS核心编程一书读到的,建议在哪个模块分配的内存,就在该模块释放,否则就容易出错。具体什么原理书里也说了,可我没记住,还得翻翻。就是说还得载dll里写一个函数void FreeMem(viod* ptr)
    {
    free(ptr);
    }
    再在main里适时调用。
      

  2.   

    在EXE文件中调用DLL时,EXE,DLL分别被映射为的不同的内存地址空间,在EXE中直接删除DLL中分配的内存是不可取的,可能带来不可预料的后果。有两种做法,一种就是楼上的朋友所说的,这也是最有效的方法;另一种方法就是建立共享内存,这种方法比较麻烦,不推荐使用。
      

  3.   

    多谢twist(廷巴克图) ,现在还有问题。在exe中调用dll的freemen成功了,
    void FreeMem(viod* ptr) 

         free(ptr); 
         ptr=NULL;

    但是在exe中 的 指针并没有=NULL。
    于是调试,进入dll中的freemen中,发现指针已经=NULL,返回到exe中,指针还是不为NULL。怎么办?
      

  4.   

    改进一下:void FreeMem(viod **ptr) 
    {
    if (*ptr) {
    free(*ptr); 
    *ptr=NULL; 
    }

    至于具体怎么写,要看程序的要求了。