DLL 中new了一个字符串,调用PostMessage发送给主程序,主程序处理了数据后delete
当主程序和dll都用vs2010编译(v100)时,不会崩溃,
当主程序和dll都用vs2017编译(v141)时,也不会崩溃,
当主程序用vs2010编译(v100),dll用vs2017编译(v141)时,就会崩溃,
出错的地方:
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
注释:
好像是说delete的指针不是本地堆内存
要遵循一个原则,谁申请,谁释放。不同的crt申请释放内存的代码并不兼容,不能dll new,主程序delete
你看windows api,那么多函数,都是调用者申请调用者释放,或者dll申请,dll释放的。
vs2017 和 vs2010生成的dll,exe不能混用的,因为它们用的不同的crt运行时,比如2017 new出来的内存结构不一样,
用vs2010 delete就不认得这个对象内存结构,释放时就会出错。所以Windows的运行时库最好只能用同一个运行时库,
你看第三方库,比如qt这些都是分不同vs20xx版本编译出来的dll,不能混用。
开发原则,保证版本库同样的比如用的是.net framework4.5就都使用4.5,主副程序使用不同版本就是会出现问题的,也需代码没有区别,但内部的编译逻辑是有变化的