DLL里有个导出函数:
void NewPlace(char * pcRet)
{
char * psz = new char[10];
strcpy(psz,"hello");
pcRet = psz;}
EXE里:
char * p;
NewPlace(p);
MessageBox(p);
出错.
静态链接的,就是用LIB的那种.

解决方案 »

  1.   

    这样当然不行了,不要在DLL中分配内存,还是在EXE中分配内存比较好,如果非要在DLL中分配可以这样做
    char * NewPlace()
    {
    char * psz = new char[10];
    strcpy(psz,"hello");
    return psz;
    }
      

  2.   

    有两种解决方法,红色的地方是改动的.至于原因,楼主自己看吧,如果看不明白,自己找本C的基础书看去。
    第一种:
    void NewPlace(char ** pcRet)
    {
    char * psz = new char[10];
    strcpy(psz,"hello");
    pcRet = psz;}
    第二种:
    char* NewPlace(void)
    {
    char * psz = new char[10];
    strcpy(psz,"hello");
    return psz;}
      

  3.   

    好,解释一下原因,其实这个问题在林锐的《高质量C++编程》中有说明,所以我抄他的东西来说明比较好。如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num){    p = (char *)malloc(sizeof(char) * num);}
     
    void Test(void){    char *str = NULL;    GetMemory(str, 100);    // str 仍然为 NULL      strcpy(str, "hello");   // 运行错误}
     示例7-4-1 试图用指针参数申请动态内存 毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-4-2。 void GetMemory2(char **p, int num){    *p = (char *)malloc(sizeof(char) * num);}
     
    void Test2(void){    char *str = NULL;    GetMemory2(&str, 100);  // 注意参数是 &str,而不是str    strcpy(str, "hello");       cout<< str << endl;    free(str);  }
     示例7-4-2用指向指针的指针申请动态内存 由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例7-4-3。 char *GetMemory3(int num){    char *p = (char *)malloc(sizeof(char) * num);    return p;}
     
    void Test3(void){    char *str = NULL;    str = GetMemory3(100);      strcpy(str, "hello");    cout<< str << endl;    free(str);  }
     
      

  4.   

    sorry第一种错了,应该是
    void NewPlace(char ** pcRet)
    {
    char * psz = new char[10];
    strcpy(psz,"hello");
    *pcRet = psz;
    }
      

  5.   

    其实这个错误的产生跟DLL没有什么直接联系,是一个指针参数,到了函数体内就是一个副本指针,改变该副本的指向,并不能改变指针参数的指向.
      

  6.   

    释放是在DLL内释放,发这个主题贴之前的关键问题是没把DLL动态申请的空间拿出来.
      

  7.   

    给你一个我的代码示例:头文件
    OSRES_DLL void *os_malloc (int size); /*申请空间并自动清空*/
    OSRES_DLL void *os_realloc (void *pMem, int sizeNew, int sizeOld); /*重新申请空间并自动清空增加的空间*/
    OSRES_DLL void  os_free (void *pMem);c文件:
    void * os_malloc(INT32 size)
    {
    void *retVal = NULL;
    if (size>0)
    {
    retVal = malloc(size);
    if (retVal)
    {
    memset(retVal,0,size);
    }
    }
    return retVal;
    }void os_free(void *pMem)
    {
    if (pMem)
    {
    free(pMem);
    }
    }
      

  8.   

    好的,感谢。
    自我总结一下:
    这事当然与指针的属性有很大关系,但是首先涉及一个基础知识,就是函数的参数在函数内是副本。
    因为最近做很多函数,把字符指针传到函数内修改字符串,所以又感性混淆了函数内的形参是实参副本这个问题。
    传一个非空指针进来,是能够改变指针指向的内容,但是指针本身是改变不了的,其实也就是最简单的例子:
    void AddInt(int x)
    {
       x = x +5;
    }
    int main()
    {
        int a = 3;
        AddInt(a);
        printf("%i\n",a);    //a仍然是3
        return 0;
    }