这种情况下会有内存泄漏吗?如果有,怎么Delete

加盾男爵 2020-07-10 02:45:51
win7/win10 ,MinGW

现在程序需要一个功能,在某个目录下(大多数情况下是在程序的目录下的一个子目录)

然后这些目录下可能有一个或多个dll,文件名不同,但每个.dll文件里都会有个函数
int foo(int x , int y)

每个.dll的文件里的函数名都相同,但函数代码不相同

然后程序在运行时,会根据不同的状况加载.dll调用foo函数,类似这样

typedef int (*FOO)(int,int);

std::string dllNms = getDevStatus(); //根据设备情况决定加载那个dll
FOO f = loadDll("F/DevDll/"+dllNms); //该函数用于加载dll文件内的foo()函数
int res = f(devNumbers,devCounts);


然后,就这段代码而言,在程序运行过程中需要多次执行,f作为一个函数指针,没有对应的delete,有没有存在内存泄漏的问题

如果有该如何delete?
delete f;

这段代码MingW编译器直接报错
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
加盾男爵 2020-07-14
  • 打赏
  • 举报
回复
引用 4 楼 真相重于对错 的回复:
dll加载大概是如此 HANDLE handle = loadliabray(.....); func = getprocessaddress(....); func(); closehandle(handle)//要释放的是这个handle 而不是那个func 另外如果func函数里面有内存泄露,因为dll是加载到调用进程的,你就算把handle释放掉,泄漏依然存在。所以要防止泄漏,一个方法是你和对方要协商好,对于函数的返回值,什么该释放,什么不该释放,要有约定。 另一个方法,也是最合适的方法,就是谁new的内存,谁负责delete。不是你的,你不要去管。
tks
真相重于对错 2020-07-14
  • 打赏
  • 举报
回复
dll加载大概是如此 HANDLE handle = loadliabray(.....); func = getprocessaddress(....); func(); closehandle(handle)//要释放的是这个handle 而不是那个func 另外如果func函数里面有内存泄露,因为dll是加载到调用进程的,你就算把handle释放掉,泄漏依然存在。所以要防止泄漏,一个方法是你和对方要协商好,对于函数的返回值,什么该释放,什么不该释放,要有约定。 另一个方法,也是最合适的方法,就是谁new的内存,谁负责delete。不是你的,你不要去管。
加盾男爵 2020-07-14
  • 打赏
  • 举报
回复
引用 2 楼 sdghchj 的回复:
决定要不要释放的不是看是不是指针,是看是否申请堆内存。delete的不是指针,而是指针指向的内存。 int a = 0; int *b = &a; 你觉得能delete b?
我就是想问,程序从本地dll中加载一个函数来执行,那执行完成后有没有必要手动释放内存 还有个问题,因为需要不断加载dll,而dll文件不是我们公司的,我们也不知道dll里函数的源代码,假设dll里的函数有new的操作而没有对应的delete,那不断调用该dll是否会造成内存泄漏,有没有办法在在(调用dll的)程序端预防该问题?
sdghchj 2020-07-13
  • 打赏
  • 举报
回复
决定要不要释放的不是看是不是指针,是看是否申请堆内存。delete的不是指针,而是指针指向的内存。 int a = 0; int *b = &a; 你觉得能delete b?
真相重于对错 2020-07-10
  • 打赏
  • 举报
回复
函数指针指向的是一段代码,又不是数据,不用释放,要释放的是那个dll的handle

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧