dll 中fun1(char *pStr1[])
{
  for(int i=0;...)
   {
     pStr1[i]=new char[10];
     pStr1[i]="test";
    }
}调用函数fun2()
{
  char *pStr2[30]={NULL};
  fun1(pStr2);
  //下面这么操作会出错
  //for (int j=0;..)
  //{
  //  delete   []pStr2[j]
  //}
  
}我怎么才能删除fun1里的指针数组呢?

解决方案 »

  1.   

    DLL中 再暴露一个清除函数
      

  2.   

    fun1(char *pStr1[])
    {
      for(int i=0;...)
       {
         pStr1[i]=new char[10];
         pStr1[i]="test";
        }
    }
    ===
    你这段代码本来就有大毛病。肯定会泄漏啊。pStr1[i] = new char[10],这句话给pStr1[i]指定了一个地址,接着你又pStr1[i]='test',这又将pStr1[i]指向另一个地址,这样new的地址就没有人知道了。到外面自然不能删除。
      

  3.   

    修改如下:
    fun1(char *pStr1[])
    {
      for(int i=0;...)
       {
         pStr1[i]=new char[10];
         strcpy(pStr1[i],"test");
        }
    }
      

  4.   

    1. pStr1[i]赋值使用memcpy或strcpy
    2. 最好暴露一个内存清理函数
      

  5.   

    我印象里在dll中开内存,在外面释放原则上是可以的,不会出错,尽管这样程序不规范,前提条件是C运行时库必须是用的动态库而不是静态库的。楼主的程序出错八成是2楼说的原因。
      

  6.   

    和楼主共勉,一起学习, char*的赋值是一种最特殊的赋值,严格意义来说不算是赋值,内存地址变化!
    再一次牢记一下!
      

  7.   

    我代码里是这么写的。    
    pStr1[i]=new char[10];
    strncpy(pStr1[i],"test"); 
    这个变量不是全局的,我怎么能再去写一个清除的函数呢?
    不明白
      

  8.   

    是这么写的strncpy(pStr1[i],"test",strlen("test"));
      

  9.   

    二楼的已经说明白了,你的问题不在pStr1上,和是不是全局变量也没关系,是因为这一句:
    pStr1[i]="test";  //相当于把"test"的指针赋予了pStr1[i],所以你删除这个静态指针就出错了改成strcpy(pStr1[i],"test"); 就只是拷贝字符串的内容,pStr1[i]还是你刚才new的那个指针,所以没问题
      

  10.   

    我再发一下代码吧,刚才没注意。我的代码是这么写的
    fun1(char *pStr1[])
    {
      for(int i=0;...)
       {
         pStr1[i]=new char[10];
         strncpy(pStr1[i],"test",strlen("test"));
        }
    }
      

  11.   

    DLL中fun1(char *pStr1[])
    {
      for(int i=0;...)
       {
         pStr1[i]=new char[10];
         strncpy(pStr1[i],"test",strlen("test"));
        }
    }
    调用函数中
    fun2()
    {
      char *pStr2[30]={NULL};
      fun1(pStr2);
      //下面这么操作会出错
      //for (int j=0;..)
      //{
      //  delete   []pStr2[j]
      //}
      
    }
      

  12.   

    1。请您问问题时一定要把问题描述清楚。否则浪费大家的感情。
    2。你的程序显然不是你的原程序,是你简写的代码,可能你的简写把问题精简掉了。
    3。你说的错误是何种错误?调试结果如何?delete是,数组的数据内容是否有效?
    4。从大的范围来说,你必须在动态库中进行new么?
      

  13.   

    如果要在dll外部释放dll中申请的内存,请使用VirtualAlloc、VirtualFree等函数,不要使用new和delete。
    或者dll提供一个释放的接口,在dll中释放内存。
      

  14.   

    dll中能不申请内存最好了,可以由外部传入
      

  15.   

    首先库里存在的问题如二楼说的,还有就是外面的char *pStr2[30]={NULL};
    又重新分配了内存,最后指针又传到 fun1(pStr2);函数里。内存泄露
      

  16.   

    你DLL与主程序的库不一样,它们的new,delete机制也不一样,不能在主程序里面释放。
    解决办法
    1:使用相同的库(比如都动态链接MFC/CRT/ALT),或者按MSDN里面的要求作相应选择。
    2:使用malloc,free(大家别拍我砖啊,我平时也不用它们的);
    3:使用native api.
      

  17.   

    void fun1(char *pStr1[])
    {
      for(int i=0; i < 30; ++i)
       {
         pStr1[i]=new char[10];
        }
    }int main()
    {  char *pStr2[30]={0};
      fun1(pStr2);
      //下面这么操作会出错
      for (int j=0; j < 30; j++)
      {
          delete[] pStr2[j];
      }
    return 0;
    }没有问题。
      

  18.   

    试试下面的代码fun1(char *pStr1[])
    {
      for(int i=0;...)
       {
         pStr1[i]=new char[10];
         sprintf_s(pStr1[i], 10, "test");
        }
    }
    fun2()
    {
      char *pStr2[30]={NULL};
      fun1(pStr2);
      
      for (int _i = 0; _i < 30; ++_i)
       delete []pStr2[_i];
     }
     
      

  19.   

    建立引入 CPtrList 或 CPtrArray 来记录动态分配的内存空间, 添加 检索 删除都很方便