DLL中申请的内存调用DLL的进程能释放它吗?
调用DLL的进程申请的内存DLL中能释放它吗?也就是说,DLL中相关内存所用的堆与调用DLL的进程所使用的堆是同一个吗?
不懂,请教!

解决方案 »

  1.   

    应该是可以释放的。
    因为dll被进程调入其私有地址空间,是可以相互访问的。
      

  2.   

    这种方法不规范,最好是在DLL中增加一个相应的内存释放函数,在EXE中调用。
    如果dll用静态连接msvcrt.dll,那么dll的初始化代码会另外分配一个crt heap,如果用动态连接,就会用process原来的crt heap,exe的情况也一样。如果dll静态连接msvcrt.dll,就会有两个crt heap,那么dll中malloc的内存块对于exe的heap来说是非法的。因此并不能保证在dll中分配的内存在exe中能正确的释放。我们写dll的目的之一就是代码重用,这种方法不能保证别的exe能不能正确的使用dll的资源
      

  3.   

    不出错的情况,如果用了CRT的内存分配(new,delete,malloc,free,...),你的dll和exe是静态或动态连接CRT的时候必须一致。project settings->c/c++->code generation->use runtime library->dll和exe选择要一致
      

  4.   

    能不能释放取决于调用的程序和DLL的程序是不是同一种语言写的 vc调用delphi的dll释放不了dll申请的内存,dll申请的内存最好在dll内部释放,或者让dll提供释放函数进行释放。
      

  5.   

    可以是可以的
    dll和調用進程共享
    內存堆,
    不過容易出錯,
      

  6.   

    通过在dll中导出一个释放函数来释放
      

  7.   

    最好还是通过一个导出函数来释放dll中的内存,这样安全多了
      

  8.   

    最好还是通过一个导出函数来释放dll中的内存,这样安全多了
      

  9.   

    严重同意楼上  kingzai()
       “最好是在DLL中增加一个相应的内存释放函数,在EXE中调用。”
      

  10.   

    我想讨论的是能不能,不是规范与否。
    (前提是DLL与EXE同一种语言写的,是通过LOADLIBRARY这种显式调用DLL)我写了一个例子,不行,这不是规范与否的问题(不建议这样做并不能解释为什么不能这样做)。
      

  11.   

    可以的。可能Dll分配的内存块,应用程序释放,会报异常。
    用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了
    其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了
      

  12.   

    是不会的,DLL未被导出的数据,是被OS以映射文件的方式注入进程空间,而系统会做copy-on-write的操作,你分配的内存是在特定的进程空间,分配的堆也是属于进程的,这样,当出现进程切换的时候,OS通过TSS将CRC3里面的数据进行了保存和写入,也就是物理内存的映射方式已经改变,没有问题的。