先说一下 你的这种做法会造成内存访问错误
方法2:
dll的函数get(void *p) ;传入的p未分配空间,由dll分配
正确的写法是get(void **p);
然后再调用的时候应该是:
void *p;
get(&p);
这样dll内部才可以用p正确的分配内存
回忆一下call by value和call by reference, 为p分配
内存的一个直接结果就是改变了p的值使它"指"向一块内存
所以要call by reference才可以
再根据你给出的代码, 我认为最好的方法是
get(tagTry **p); p是一个未初始化的指针
调用
tagTry *p;
get(&p);优点: 由于你tagTry型的实例的
内存分配放在了dll内部, 所以这样做是效率
最高的, 可以做到"量体裁衣"缺点: 增加了内存管理的复杂程度.

解决方案 »

  1.   

    我覺得應在應用程序中分配空間,在dll中處理比較好
      

  2.   

    多谢greentape指正我的第二种方法
    内存分配放在dll内部,效率是高,但我觉得,由应用程序中来释放dll中分配的内存
    这种方法,会不会有另外的问题?
      

  3.   

    一般来说, 增加了内存管理的复杂程度.如果条件许可的话, 就近释放是最简单的, 就如happymeng同学说的.
    但有的时候不适用, 如a中调用b, b分配并填充n Bytes的buffer, n对a未知,
    而buffer中的所有东西都有用, 那么此时内存的分配就只有在b中进行
    了, 内存怎么回收就要根据具体的需求了. 此时b可以不带参数, 直接把
    buffer地址返回给a即可. 比如说这样的函数生命char* foo();
    {
    char *pszBuf;
    pszBuf = new char[10000];
    return pszBuf;
    }这样直接返回地址的意图更明确, 就等于告诉你说, foo中进行了内存分配, 注意回收问题
    这样用起来比 char**什么的要更简单些了
      

  4.   

    一个基本原则是:如果事先知道需要的内存大小,则在应用程序中分配要好一些;若事先不知道,则应在dll中分配。
      

  5.   

    实际上就是一个返回值还是返回指针的问题
    如果内存在应用程序分配,那就返回值。
    否则内存在dll中分配,则返回指向内存的指针。
    不知是否这样?