释放别人分配的内存 我的vb程序调用一个dll,dll中分配了一个BSTR,请问,当我用vb获得了这个bstr之后,该如何释放? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般来说内存的分配与释放均应封装在DLL中比较合理,而DLL里面只有内存分配而将释放处理交给调用去处理这种做法是不合理的。 to winehero(编程人生) :但现在的关键是,我们没有那个dll的源代码,只能从vb来下手解决问题,请问我该怎么办呢? 楼主逻辑混乱!别人的内存,你怎么可能释放呢?dll既然允许别的程序控制自己的内存,那说明它自身没有控制这段内存;既然没有控制,那还需要释放什么? 不能释放别人的内存,这是 windows 最基本的原则, to viena(维也纳nn-实心木头人):不好意思,你的这段我没看明白,既然已经分配了内存,为什么可以不释放呢?to viena(维也纳nn-实心木头人),zlt982001(乐天) ,Gujianda(朝成暮毁):我看到msdn中有下面一段:我的理解是,一般情况下,分配和释放分配给 BSTR 的内存的规则如下: 当调用进来一个需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并且在完成操作之后将其释放。例如: HRESULT IWebBrowser2::put_StatusText( BSTR bstr );// shows using the Win32 function // to allocate memory for the string: BSTR bstrStatus = ::SysAllocString( L"Some text" );if (bstrStatus == NULL) return E_OUTOFMEMORY;pBrowser->put_StatusText( bstrStatus );// Free the string:::SysFreeString( bstrStatus );//...当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。例如: HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr ); //...BSTR bstrStatus;pBrowser->get_StatusText( &bstrStatus );// shows using the Win32 function // to freee the memory for the string: ::SysFreeString( bstrStatus );当实现返回 BSTR 的函数时,请分配字符串,但不要释放它。接收函数会释放内存。例如: // Example shows using MFC's // CString::AllocSysString//...HRESULT CMyClass::get_StatusText( BSTR * pbstr ){ try { //m_str is a CString in your class *pbstr = m_str.AllocSysString( ); } catch (...) { return E_OUTOFMEMORY; }// The client is now responsible for freeing pbstr.return( S_OK );}//... winehero(编程人生)说的有道理啊既然是封装在Dll中的 自然应该在Dll中释放 即使没释放 也不应该在程序中处理 因为你根本不知道该DLL是怎么申请到那块内存的(SysAllocString?NEW?MALLOC?),所以你没法在VB里释放。而如果该DLL没有提供释放的入口,那么该DLL就不是个妥善的DLL。 问一个在listview中关于字段中包含布尔类型,我想在另外的checkbox中显示出记录中该字段是“是”还是“否” 请教ADO与ODBC API两种方式访问数据库各适应于什么情况? 求Basic书籍 MSDatGrd.OCX **关于控件的问题,很紧急,很简单** VB媒体播放器程序怎样控制视频窗口全屏 程序异常:-529697949代表什么错误? asp传值问题 关于DataGrid控件在程序打包安装后出错!!! 我新开了一个VB.NET专栏 简单的语句问题 大家帮忙看下 在线等 关于datalist和datacombo的初级问题
交给调用去处理这种做法是不合理的。
但现在的关键是,我们没有那个dll的源代码,只能从vb来下手解决问题,请问我该怎么办呢?
dll既然允许别的程序控制自己的内存,那说明它自身没有控制这段内存;
既然没有控制,那还需要释放什么?
不好意思,你的这段我没看明白,既然已经分配了内存,为什么可以不释放呢?
to viena(维也纳nn-实心木头人),zlt982001(乐天) ,Gujianda(朝成暮毁):
我看到msdn中有下面一段:
我的理解是,
一般情况下,分配和释放分配给 BSTR 的内存的规则如下:
当调用进来一个需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并且在完成操作之后将其释放。例如:
HRESULT IWebBrowser2::put_StatusText( BSTR bstr );
// shows using the Win32 function
// to allocate memory for the string:
BSTR bstrStatus = ::SysAllocString( L"Some text" );
if (bstrStatus == NULL)
return E_OUTOFMEMORY;
pBrowser->put_StatusText( bstrStatus );
// Free the string:
::SysFreeString( bstrStatus );
//...
当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。例如:
HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr );
//...
BSTR bstrStatus;
pBrowser->get_StatusText( &bstrStatus );
// shows using the Win32 function
// to freee the memory for the string:
::SysFreeString( bstrStatus );
当实现返回 BSTR 的函数时,请分配字符串,但不要释放它。接收函数会释放内存。例如:
// Example shows using MFC's
// CString::AllocSysString
//...
HRESULT CMyClass::get_StatusText( BSTR * pbstr )
{
try
{
//m_str is a CString in your class
*pbstr = m_str.AllocSysString( );
}
catch (...)
{
return E_OUTOFMEMORY;
}
// The client is now responsible for freeing pbstr.
return( S_OK );
}
//...
既然是封装在Dll中的 自然应该在Dll中释放
即使没释放 也不应该在程序中处理