不管我怎么弄,动态链接库里开辟的内存,总是不能释放掉。1、动态链接库里,new一块内存,主程序调用后,在主程序里delete掉,运行时报错!2、动态链接库里,new一块内存,立即delete掉,调试发现根本没delete掉,而在主程序里同样的代码,可以delete掉;3、动态链接库里,定义一全局指针变量,一函数实现该指针开辟空间,另一函数实现释放该指针针向的空间,调试发现仍然没有真正释放掉;4、动态链接库里,new一块内存,主程序调用后,再用ZeroMemory对该空间进行清0,成功,但不应该算把空间释放掉了吧。考虑到程序独立性问题,我想动态链接库new一块内存,另一函数实现delete掉,但为什么没法真正实现?不信大家试试!

解决方案 »

  1.   

    肯定的事情,除非你用API GlobalAlloc HeapAlloc之类的方式.
    简单的办法是 dll中导出一个函数,这个函数用于删除DLL中分配的函数.
      

  2.   

    因为DLL和Exe中的new delete处于不同的运行库中
    分别保存着不同的内存分配表,不能混合使用的.
      

  3.   

    回复 akirya :
    那你说怎么实现,我说的4种方法好像都不行
      

  4.   

    to 楼主你试试这种方式,dll提供两个函数给客户:一个是返回指针,指向DLL里开辟的内存,另一个用于客户释放该指针。比如以下两个函数,一个返回一个指针,另一个对其释放。MYDLL void Alloc(int** ppValue)
    {
        *ppValue = new int;
        **ppValue = 3;
    }MYDLL void Release(int* pValue)
    {
        if(pValue != NULL)
        {
    delete pValue;
        }
    }我做了测试,确认在调用Release后,内存确实被释放了。
      

  5.   

    to 楼主你可以参考一下《windows核心编程》(jeffrey)第19章中的“DLL和进程的地址空间”。
      

  6.   

    问题好像是下面的错误:CInternetSession   sess; 
    这一行在静态库里也可以通过,在程序里也可以通过;在动态库里编译也不出错,就是调用的时候出了错 请问下这个怎么解决?--------------------------------
    用CInternetSession时头文件:   
    #include <afxinet.h>
    #include <wininet.h>
      

  7.   

    出什么错?如果是debug下出assert,建议你retry一下跟进去看看。
      

  8.   

    回复 new__day :
    你可以在写简单的动态链接库里调试一下,我不知道为什么错了,release模式下不报错。估计我说的释放空间不成功可能就是这个造成的
      

  9.   

    关于DLL内存释放的问题,其他人和我已经说的差不多了。
    剩下的可能需要你自己耐心地调试下去。
      

  10.   

    还是有问题!动态链接库里,一函数内实现开辟空间,另一函数实现释放空间,若DLL是DEBUG的,释放成功,但DLL是Release版本的话,释放又不成功,作何解释?
      

  11.   

    这样跟你说吧
    在DLL中new出来的内存只能在DLL中释放.
    在EXE中new出来的内存只能在EXE中释放.至于做法,可以用4楼的方法.那是正确的做法.
    也可以用API分配,释放内存.
      

  12.   

    我试了,release没问题。你去看看《核心编程》吧,那里有更为严谨的解释。
      

  13.   

    回复 new__day :
    我QQ是:76467474,能否交流一下,谢谢
      

  14.   

    你们遇到的是VC调试器的内存检查,实际上是可以这样做的。
    因为通常情况下new与delete是相对应的,在哪个模块中new,就在哪个模块中delete,所以调试器认为跨模块delete是程序的错误,不相信的用Release编译,Ctrl-F5执行自己去试。
      

  15.   

    #include <iostream.h>
    #include <string.h>void main()
    {
    char *p = new char[10];
    strcpy(p, "abc");
    delete [] p;
    cout<<p<<endl;
    } 这个程序,在DEBUG和RELEASE两种模式下编译运行,看看结果分别是什么?我说的问题简化之就是这个问题了,并不是DLL里的问题。
      

  16.   

    #include<iostream.h>
    #include<string.h>
    void main()
    {
      char *str1 = "abcdef";
      int len1 = strlen(str1);
      char *str2 = new char[len1];
      int len2 = strlen(str2);
      cout << len2 << endl;
    } 还有这个程序,DEBUG和RELEASE下的结果
      

  17.   

    对于delete之后指针仍可使用的问题,涉及到系统对堆的管理机制。delete操作只是告知系统这个内存块不再使用了,系统并不一定会立即释放,而且有些时候也不可能立即释放。
    x86CPU保护机制把4KB分为一页,按页管理,为进程分配地址空间时必须是以页为单位的。为了不浪费内存资源,从堆中分配时可能会在一个内存页中分配多个内存块,此时必须等到所有内存块都delete之后才可释放此内存页。
    实际上系统内部有很多事情不是立即就处理的,例如程序创建一个文件,然后写一些数据,再关闭文件,所有过程系统都返回成功,而实际上可能并没有向磁盘中写入数据,此时立即关闭电源,你可能会在磁盘上找不到一点与该文件相关的信息。
      

  18.   

    怎么不行了?
    我的项目一直都这样,没什么问题,我的EXE直接delete由dll new的对象..一直都没问题..
    LZ的EXE是一个控制台程序吧.其实是ASSERT导致的,分析一下吧.
    出错是下面代码
     /*
             * If this ASSERT fails, a bad pointer has been passed in. It may be
             * totally bogus, or it may have been allocated from another heap.
             * The pointer MUST come from the 'local' heap.
             */
            _ASSERTE(_CrtIsValidHeapPointer(pUserData));
    注释写的很清楚了,_CrtIsValidHeapPointer检查内存是否有效或者是'local' heap.但DLL里面明显不是,因此这里是会弹出错误的.但release是不检查的,因此release是成功的.另外MFC也是正常的,因为MFC不再使用上面的代码去检查内存.
    下面是我写的测试代码,EXE释放10000次DLL NEW的内存,对象也调用了析构函数.调用前用内存使用4440KB,调用后是4450KB.第二次是4452KB..明显被释放了.BoundsChecker检查过,无发现内存泄露.
    下面是代码:
    dll
    ----------------------------------// This class is exported from the testdll.dll
    class TESTDLL_API CTestdll {
    public:
    CTestdll(void);
    char data[512];
    // TODO: add your methods here.
    ~CTestdll(void);
    };
    // This is the constructor of a class that has been exported.
    // see testdll.h for the class definition
    CTestdll::CTestdll()

    return; 
    }
    CTestdll::~CTestdll()
    {
    // MessageBox(NULL,"~CTestdll","test",0);
    OutputDebugString("delete~~~");
    }// This is an example of an exported function.
    TESTDLL_API CTestdll * fnTestdll(void)
    {
    //new内存
    return new CTestdll;
    }下面是EXE..MFC和控制台一样
    --------------------------------
    for(int i=0;i<10000;i++)
    {
    CTestdll * pClass = fnTestdll();

    delete pClass;
    }你调用delete,windows不一定会回首你的内存..好好看看windows内存管理的..我觉得是LZ的代码有问题,要么就是测试有问题.
      

  19.   

    不管我怎么弄,动态链接库里开辟的内存,总是不能释放掉。 1、动态链接库里,new一块内存,主程序调用后,在主程序里delete掉,运行时报错! 
    2、动态链接库里,new一块内存,立即delete掉,调试发现根本没delete掉,而在主程序里同样的代码,可以delete掉;
    3、动态链接库里,定义一全局指针变量,一函数实现该指针开辟空间,另一函数实现释放该指针针向的空间,调试发现仍然没有真正释放掉; 
    4、动态链接库里,new一块内存,主程序调用后,再用ZeroMemory对该空间进行清0,成功,但不应该算把空间释放掉了吧。 
    考虑到程序独立性问题,我想动态链接库new一块内存,另一函数实现delete掉,但为什么没法真正实现?不信大家试试!
    ----------------------- 
    你没有重载 new 和 delete 吧!!!
    用::new ::delete 试试
      

  20.   

    sigh, 这种错误居然也犯。
    哪里new的,哪里delete。另外,严重怀疑楼主的debug/release配置是不是出了问题。呵呵。