有关DLL中申请的内存在外部释放的问题。

具体情况是这样的,我有应用程序,调用了一个DLL。在DLL中有一个函数,返回一个字符串指针,使用完了之后在应用程序中释放这个字符串指针。

在应用程序和DLL用同一个版本的VS编译的时候,调用是没有问题的。

当我用VS2010编译的应用程序去调用用VS2013编译的DLL时,在释放这个指针的时候应用程序就崩溃了。

有大婶知道这是怎么回事吗?

这个是因为不同的编译器版本,他们的VC运行时库等实现会有区别,共享堆会有实现的区别,所以你不能在不同版本编译器的DLL之间的指针进行跨模块的释放。
这样会产生不可预期的错误。这个是不被允许的。

这是错误的设计,应该是谁申请谁释放。

比如API函数 RegQueryValue
调用先传入指针lpValue=NULL,就会从参数lpcbValue返回需要的长度;
然后调用者申请内存,再次调用,函数就会向指针复制数据;
最后当然是由调用者来释放的。

这种问题就是设计上的bug了,dll内部申请了内存,要么提供释放接口,要么自己在结束时析构掉申请的内存。申请内存与释放内存保持一个原则:哪里申请哪里释放,中间的指针传递与此无关