先说一下 你的这种做法会造成内存访问错误
方法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内部, 所以这样做是效率
最高的, 可以做到"量体裁衣"缺点: 增加了内存管理的复杂程度.
方法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内部, 所以这样做是效率
最高的, 可以做到"量体裁衣"缺点: 增加了内存管理的复杂程度.
内存分配放在dll内部,效率是高,但我觉得,由应用程序中来释放dll中分配的内存
这种方法,会不会有另外的问题?
但有的时候不适用, 如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**什么的要更简单些了
如果内存在应用程序分配,那就返回值。
否则内存在dll中分配,则返回指向内存的指针。
不知是否这样?