这是调用的代码
typedef char** ShowDataofbaseExAA(int n,int nl,char* fdText[7],CString strSelect);
ShowDataofbaseExAA *ShowDataFun;
his=::LoadLibrary("DbaseIF.dll");
ShowDataFun= (ShowDataofbaseExAA*)GetProcAddress(his,"ShowDataofbaseExAA");
char** chvalue;
chvalue=new char*[5];
chvalue=(*ShowDataFun)(5,0,fdText,string);
FreeLibrary(his);
for(int i=0;i<=4;i++)
{
szvalue.Format("%s",chvalue[i]);
                  AfxMessageBox(szvalue);
          }
调用之后释放吗?

解决方案 »

  1.   

    chvalue=new char*[5];
    这一句不要了,下面一掉指针被改掉了,导致内存泄漏调用完之后释放不过你这种Dll函数的设计感觉很别扭,何不自己外面申请,作为参数传进去再填充呢
      

  2.   

    chvalue=new char*[5];
    chvalue=(*ShowDataFun)(5,0,fdText,string); // 这个函数调用之后,原来申请的5个char*就丢失了,造成了内存的泄漏具体的释放办法得考虑你在ShowDataofbaseExAA的申请情况,也就是说先对chvalue[0]~chvalue[n]进行释放,然后再释放chvalue本身。
      

  3.   

    我在以上代码的下方添加如下代码,但是当窗口关闭时就出现错误,是内存方面的问题
    for(int j=0;j<5;j++)
    {
      delete []chvalue[j];
    }
    delete []chvalue;
      

  4.   

    这是DLL中的函数
    DllExport char** ShowDataofbaseExAA(int nSyflag,int nSyf,char* fdText[],CString strSelect)
    { AFX_MANAGE_STATE(AfxGetStaticModuleState());
    _bstr_t strsql=strSelect;
    CString szhr;
    char** chvalue;
    chvalue=new char*[nSyflag];
    if(theApp.GetConState())
    {
    if(theApp.GetRecordState()) theApp.m_set->Close();
    theApp.m_set=theApp.m_con->Execute(strsql,NULL,adCmdText);
    FieldsPtr m_pFields=theApp.m_set->GetFields();
    FieldPtr fd;
    _variant_t hr;
    long i=0;
    if(!theApp.m_set->adoEOF)
    {
    for(long j=0;j<nSyflag;j++)
    {
    hr=theApp.m_set->GetCollect(fdText[j]);
    szhr.Format("%s",(char*)(_bstr_t)hr);
    szhr.TrimRight();
    chvalue[j]=new char[nSyflag];
    // chvalue[j]=szhr.GetBuffer(szhr.GetLength());
    strcpy(chvalue[j],szhr);
    }
    }
    return chvalue;
    }
    else
    {
    AfxMessageBox("连接对象不存在!");
    return chvalue;
    }
    }
      

  5.   

    因为数据库中确定要搜索的记录就是一条记录所以没有加循环而是 if 语句
    if(!theApp.m_set->adoEOF)
      

  6.   

    在函数外申请,调用函数以后,再释放。
    或再提供一个函数,来释放DLL中分配的内存。