动态链接库里面分配内存的问题

时间:2022-03-01 15:46:50
在动态链接库里面new出来的内存会在dll卸载时失效(具体表现是,new返回一个对象指针,在动态链接库卸载后再delete会出错)

有没有办法做到动态链接库卸载后这部分内存仍保留呢?

9 个解决方案

#1


智能指针:shared_ptr

#2


谁分配谁释放

#3


关注,学习!

#4


自己建拷贝。内存谁申请谁释放

#5


引用 1 楼 loaden 的回复:
智能指针:shared_ptr

智能指针也不行 只要dll卸载后操作里面分配的内存就会出错

==================
我现在的程序需要在启动时从dll里面获得一些对象
并一直用到程序结束才释放
所以如果我在程序结束前释放了dll则会导致这些对象析构时出错
但如果不显式释放dll又感觉不好
所以想找办法让dll分配对象空间时分配到程序堆中,而不要分配到dll堆中

#6


引用 5 楼 kingstarer 的回复:
引用 1 楼 loaden 的回复:
智能指针:shared_ptr

智能指针也不行 只要dll卸载后操作里面分配的内存就会出错

==================
我现在的程序需要在启动时从dll里面获得一些对象
并一直用到程序结束才释放
所以如果我在程序结束前释放了dll则会导致这些对象析构时出错
但如果不显式释放dll又感觉不好
所以想找办法让dll分配对象空间时……

我的意思是:从EXE向DLL传递一个智能指针。

#7


还是想不明白ls的意思
==========
现在我的情况是这样的
定义了一个接口IA;
动态链接库里面提供了一个函数,返回一个指向IA子类的对象
IA *getChild() { return new Child();} //Child的实现不在exe里面
exe里面打开动态链接库调用getChild
==========
获得的指针会一直持续用到程序结束,而动态链接库则不再需要调用
==========
所以我想获得指针后就关闭动态链接库,节省点资源
但是发现这样一关,指针所指向的内存就失效了
==========
不知道用智能指针如何处理这样的情况?

#8


用GlobalAlloc,GlobalFree代替


或者在dll里面写个管理类
class ManageMemory
{
public:
   virtual void* New(size_t size) //注意前面加virtual
   {
      m_ptr=new char[size];
      return m_ptr;
   }
   virtual void* Delete()
   {
     if(m_ptr)
     {
       delete m_ptr;
       m_ptr=NULL;
     }
   }
private:
    void* m_ptr;
};

//简单的封装 然后内存分配释放全部调用New/Delete

#9


delete []m_ptr; //掉了

#1


智能指针:shared_ptr

#2


谁分配谁释放

#3


关注,学习!

#4


自己建拷贝。内存谁申请谁释放

#5


引用 1 楼 loaden 的回复:
智能指针:shared_ptr

智能指针也不行 只要dll卸载后操作里面分配的内存就会出错

==================
我现在的程序需要在启动时从dll里面获得一些对象
并一直用到程序结束才释放
所以如果我在程序结束前释放了dll则会导致这些对象析构时出错
但如果不显式释放dll又感觉不好
所以想找办法让dll分配对象空间时分配到程序堆中,而不要分配到dll堆中

#6


引用 5 楼 kingstarer 的回复:
引用 1 楼 loaden 的回复:
智能指针:shared_ptr

智能指针也不行 只要dll卸载后操作里面分配的内存就会出错

==================
我现在的程序需要在启动时从dll里面获得一些对象
并一直用到程序结束才释放
所以如果我在程序结束前释放了dll则会导致这些对象析构时出错
但如果不显式释放dll又感觉不好
所以想找办法让dll分配对象空间时……

我的意思是:从EXE向DLL传递一个智能指针。

#7


还是想不明白ls的意思
==========
现在我的情况是这样的
定义了一个接口IA;
动态链接库里面提供了一个函数,返回一个指向IA子类的对象
IA *getChild() { return new Child();} //Child的实现不在exe里面
exe里面打开动态链接库调用getChild
==========
获得的指针会一直持续用到程序结束,而动态链接库则不再需要调用
==========
所以我想获得指针后就关闭动态链接库,节省点资源
但是发现这样一关,指针所指向的内存就失效了
==========
不知道用智能指针如何处理这样的情况?

#8


用GlobalAlloc,GlobalFree代替


或者在dll里面写个管理类
class ManageMemory
{
public:
   virtual void* New(size_t size) //注意前面加virtual
   {
      m_ptr=new char[size];
      return m_ptr;
   }
   virtual void* Delete()
   {
     if(m_ptr)
     {
       delete m_ptr;
       m_ptr=NULL;
     }
   }
private:
    void* m_ptr;
};

//简单的封装 然后内存分配释放全部调用New/Delete

#9


delete []m_ptr; //掉了