解决方案 »

  1.   

    哪个DLL申请内存,哪个DLL释放内存;STL容器不能跨DLL使用。
    源头似乎是每个EXE和DLL都有各自的内存管理堆,一个堆不能释放由另一个堆管理的内存,传地址没用
      

  2.   


    没有使用指针什么的啊~是不是结构体Camera需要释放,以及全局变量Vector也需要释放啊~
      

  3.   

    补充一点,MFC对象的管理也是各EXE和DLL分别管理的要查问题出在哪里自己去查吧
    我用DLL也不是很多,而且不管DLL本身是什么功能,全部强制纯C接口,不导出任何对象和类
      

  4.   

    不知道你的DLL到底都导出了些什么
    只从你贴出的代码来看,Camera继承了CObject类,是一个MFC对象,不能跨DLL,全局Vector也不能跨DLL,可能的问题点太多,以我的水平,只能一点点删除代码看删到哪里不出问题,或者彻底根绝这类可能性规定只用纯C接口函数
    申请释放内存可能在很多地方发生,例如一个vector的push_back,如果现有内存不足,就必须先申请新内存再释放旧内存,而vector是模板,在各EXE和DLL中都有自己的一份实例,因此如果一个vector在DLL中初始化却在EXE中push_back,那就有很大的可能性出问题。同理,你的int ConnectChannel(string _ipAdress)导出函数使用了std::string容器,以我的水平不能判断这种情况会不会出问题,所以我写这种代码的时候只传char*指针不会传std::string容器。
      

  5.   

    ConnectChannel(string _ipAdress)形参用string应该没太大问题,如果是非const引用或指针就有问题。不过还是不推荐写DLL接口时使用STL。我觉得出错的地方应该是全局vector的使用,就像8楼说的。exe和DLL有可能操作同一个vector,不可避免的会有push导致的重分配内存。
      

  6.   

    不知道你的DLL到底都导出了些什么
    只从你贴出的代码来看,Camera继承了CObject类,是一个MFC对象,不能跨DLL,全局Vector也不能跨DLL,可能的问题点太多,以我的水平,只能一点点删除代码看删到哪里不出问题,或者彻底根绝这类可能性规定只用纯C接口函数
    申请释放内存可能在很多地方发生,例如一个vector的push_back,如果现有内存不足,就必须先申请新内存再释放旧内存,而vector是模板,在各EXE和DLL中都有自己的一份实例,因此如果一个vector在DLL中初始化却在EXE中push_back,那就有很大的可能性出问题。同理,你的int ConnectChannel(string _ipAdress)导出函数使用了std::string容器,以我的水平不能判断这种情况会不会出问题,所以我写这种代码的时候只传char*指针不会传std::string容器。问题以解决~感谢各位~