zoukankan      html  css  js  c++  java
  • DLL分配的内存如何在EXE里面释放

    总结下面几个要点:

    1. 保证内存分配和清除的统一性:如果一个DLL提供一个能够分配内存的函数,那么这个DLL同时应该提供一个函数释放这些内存。数据的创建和清除应该在同一个层次上。

    曾经遇到过这样的例子:在dll中分配了一块内存,通过PostMessage将其地址传给应用。然后应用去释放它,结果总是报异常。

    2.如果exe用 MFC Appwizard方式生成, dll用win32方式生成,则运行时会出现错误。进一步用单步跟踪,发现mfc方式和win32方式下的new操作符是用不同方式实现的,源程序分别在VC目录的文件 Afxmem.cpp和new.cpp中。有兴趣的话可以自已跟踪一下。

    因为dll输出函数后,并不知道是哪一个模拟调用它,因此new和delete配对时最好在一个文件中,这样可以保证一致性。

    3. 问题主要在于DLL和EXE主程序中分配内存的堆不一样,你可以不用new和delete,而是用

    1) ::HeapAlloc(::GetProcessHeap(),...)和::HeapFree(::GetProcessHeap(),...)

    2) ::GlobalAlloc()和::GlobalFree()

    这两对API,这样无论在DLL中还是在主程序中都是在进程默认堆中分配,就不会出错了。

    4. 还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了。不过MFC就不能用Shared模式了。

  • 相关阅读:
    CF1329A Dreamoon Likes Coloring(贪心)
    CF1330B Dreamoon Likes Permutations
    AcWing338 计数问题(数位dp)
    AcWing311 月之谜(数位dp)
    AcWing310 启示录(数位dp)
    CF1332E Height All the Same(数学)
    CF1332D Walk on Matrix(构造)
    CF1332C K-Complete Word(思维)
    js作用域
    js原型链笔记
  • 原文地址:https://www.cnblogs.com/lpxblog/p/5235167.html
Copyright © 2011-2022 走看看