说说DLL中内存问题

  今天调试动态库的时候,有个函数在返回的时候总是要报错。在CALLSTACK窗口中看见是堆栈释放出了问题。但是我一向也是坚持谁申请谁释放不是就OK了吗。空气这函数里面还没有堆操作,全部是局部变量啊,怎么会出错呢?

经过仔细排查,最后把函数的调用方式全部改为_stdcall方式,当时还以为是不是参数出入栈问题,找不到原因就乱碰吧。但是虽然不是这里的问题,我却发现,当函数调用方式改为_stdcall方式后,调试时CALL STACK中的提示却变得清晰,不像以前那样全是难读的汇编代码,而是可以看清楚的函数调用关系。通过CALL STACK往回追踪,找到了是参数中使用了CString类型作为参数,就是他引起的问题了。

原因个人分析如下:

     初看上去,CString是函数的参数,应该是一个局部变量吧,不会有问题吧。可是要清楚的是在对CString赋值的时候,它不是复制了一份,而是对原字符串增加了一个引用,到该变量生命周期结束时再解除引用。但问题是我传递给该参数的字符串是从主应用程序中,也就是说是另一个模块中。在该过程中也就间接地形成了我(主程序)申请,你(动态库)释放了。所以导致错误产生。

由于CString使用方面,很多时候都想方设法的去使用他们来完成字符串操作。用多了,就把他们当成int、char等基本类型使用了,都忘记了他们是经过加工的类了。于是问题就是常常处在这些使用最熟悉的东西身上。在此笔记一下,以吸取教训,以希望能让看到此文者不在犯这样的错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存加载动态库 MemoryLoadLibrary 有例子。 /* * Memory DLL loading code * Version 0.0.3 * * Copyright (c) 2004-2013 by Joachim Bauch / mail@joachim-bauch.de * http://www.joachim-bauch.de * * The contents of this file are subject to the Mozilla Public License Version * 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is MemoryModule.h * * The Initial Developer of the Original Code is Joachim Bauch. * * Portions created by Joachim Bauch are Copyright (C) 2004-2013 * Joachim Bauch. All Rights Reserved. * */ #ifndef __MEMORY_MODULE_HEADER #define __MEMORY_MODULE_HEADER #include typedef void *HMEMORYMODULE; typedef void *HMEMORYRSRC; typedef void *HCUSTOMMODULE; #ifdef __cplusplus extern "C" { #endif typedef HCUSTOMMODULE (*CustomLoadLibraryFunc)(LPCSTR, void *); typedef FARPROC (*CustomGetProcAddressFunc)(HCUSTOMMODULE, LPCSTR, void *); typedef void (*CustomFreeLibraryFunc)(HCUSTOMMODULE, void *); /** * Load DLL from memory location. * * All dependencies are resolved using default LoadLibrary/GetProcAddress * calls through the Windows API. */ HMEMORYMODULE MemoryLoadLibrary(const void *); /** * Load DLL from memory location using custom dependency resolvers. * * Dependencies will be resolved using passed callback methods. */ HMEMORYMODULE MemoryLoadLibraryEx(const void *, CustomLoadLibraryFunc, CustomGetProcAddressFunc, CustomFreeLibraryFunc, void *); /** * Get address of exported method. */ FARPROC MemoryGetProcAddress(HMEMORYMODULE, LPCSTR); /** * Free previously loaded DLL. */ void MemoryFreeLibrary(HMEMORYMODULE); /** * Find the location of

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值