不管我怎么弄,动态链接库里开辟的内存,总是不能释放掉。1、动态链接库里,new一块内存,主程序调用后,在主程序里delete掉,运行时报错!2、动态链接库里,new一块内存,立即delete掉,调试发现根本没delete掉,而在主程序里同样的代码,可以delete掉;3、动态链接库里,定义一全局指针变量,一函数实现该指针开辟空间,另一函数实现释放该指针针向的空间,调试发现仍然没有真正释放掉;4、动态链接库里,new一块内存,主程序调用后,再用ZeroMemory对该空间进行清0,成功,但不应该算把空间释放掉了吧。考虑到程序独立性问题,我想动态链接库new一块内存,另一函数实现delete掉,但为什么没法真正实现?不信大家试试!
简单的办法是 dll中导出一个函数,这个函数用于删除DLL中分配的函数.
分别保存着不同的内存分配表,不能混合使用的.
那你说怎么实现,我说的4种方法好像都不行
{
*ppValue = new int;
**ppValue = 3;
}MYDLL void Release(int* pValue)
{
if(pValue != NULL)
{
delete pValue;
}
}我做了测试,确认在调用Release后,内存确实被释放了。
这一行在静态库里也可以通过,在程序里也可以通过;在动态库里编译也不出错,就是调用的时候出了错 请问下这个怎么解决?--------------------------------
用CInternetSession时头文件:
#include <afxinet.h>
#include <wininet.h>
你可以在写简单的动态链接库里调试一下,我不知道为什么错了,release模式下不报错。估计我说的释放空间不成功可能就是这个造成的
剩下的可能需要你自己耐心地调试下去。
在DLL中new出来的内存只能在DLL中释放.
在EXE中new出来的内存只能在EXE中释放.至于做法,可以用4楼的方法.那是正确的做法.
也可以用API分配,释放内存.
我QQ是:76467474,能否交流一下,谢谢
因为通常情况下new与delete是相对应的,在哪个模块中new,就在哪个模块中delete,所以调试器认为跨模块delete是程序的错误,不相信的用Release编译,Ctrl-F5执行自己去试。
#include <string.h>void main()
{
char *p = new char[10];
strcpy(p, "abc");
delete [] p;
cout<<p<<endl;
} 这个程序,在DEBUG和RELEASE两种模式下编译运行,看看结果分别是什么?我说的问题简化之就是这个问题了,并不是DLL里的问题。
#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下的结果
x86CPU保护机制把4KB分为一页,按页管理,为进程分配地址空间时必须是以页为单位的。为了不浪费内存资源,从堆中分配时可能会在一个内存页中分配多个内存块,此时必须等到所有内存块都delete之后才可释放此内存页。
实际上系统内部有很多事情不是立即就处理的,例如程序创建一个文件,然后写一些数据,再关闭文件,所有过程系统都返回成功,而实际上可能并没有向磁盘中写入数据,此时立即关闭电源,你可能会在磁盘上找不到一点与该文件相关的信息。
我的项目一直都这样,没什么问题,我的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的代码有问题,要么就是测试有问题.
2、动态链接库里,new一块内存,立即delete掉,调试发现根本没delete掉,而在主程序里同样的代码,可以delete掉;
3、动态链接库里,定义一全局指针变量,一函数实现该指针开辟空间,另一函数实现释放该指针针向的空间,调试发现仍然没有真正释放掉;
4、动态链接库里,new一块内存,主程序调用后,再用ZeroMemory对该空间进行清0,成功,但不应该算把空间释放掉了吧。
考虑到程序独立性问题,我想动态链接库new一块内存,另一函数实现delete掉,但为什么没法真正实现?不信大家试试!
-----------------------
你没有重载 new 和 delete 吧!!!
用::new ::delete 试试
哪里new的,哪里delete。另外,严重怀疑楼主的debug/release配置是不是出了问题。呵呵。