我在一个类中使用此代码来让webbrowser控件访问一个网站:
void myClass::visitWeb(const char *url)
{
WCHAR buffer[MAX_LEN];
ZeroMemory(buffer, sizeof(buffer));
MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, url, strlen(url), buffer, sizeof(buffer)-1);
VARIANT vURL;
vURL.vt = VT_BSTR;
vURL.bstrVal = SysAllocString(buffer);
// webbrowser navigate code...
VariantClear(&vURL);
}
我从另一个在应用程序的handlemessage()上调用的void函数调用visitWeb。 我需要在这里做一些内存释放吗?我看到varurClear正在释放vURL,但是我应该为缓冲区释放内存吗? 我被告知在另一个bool中,我在同一个应用程序中我不应该释放任何东西,因为当bool返回true / false时,一切都清楚了,但是这个空白会发生什么?
答案 0 :(得分:5)
我认为您对内存管理的理解存在一些基本问题。在这种情况下,不,您不需要显式释放任何内存。您没有致电new
,因此您无需致电delete
。 buffer
仅存在于堆栈中,并且在此方法返回时将消失。
答案 1 :(得分:3)
如果可能的话,我建议这样做有点不同 - 我首先要创建一个小班:
class bstr {
VARIANT content;
public:
bstr(char const *url) {
WCHAR buffer[MAX_LEN] = {0};
MultiByteToWideChar(CP_ACP,
MB_ERR_INVALID_CHARS,
url,
strlen(url),
buffer,
sizeof(buffer)/sizeof(buffer[0])-1);
content.V_T = VT_BSTR;
content.bstrVal = SysAllocString(buffer);
}
operator VARIANT const &() { return content; }
~bstr() { VariantClear(&content); }
};
然后您的代码将更改为:
void myClass::visitWeb(const char *url) {
your_control.Navigate(bstr(url));
}
并从那里自动处理所有分配和释放。
即使你没有使用这样的类,也要注意对MultiByteToWideChar
的调用的更改。最后一个参数应该是缓冲区中WCHAR
元素的数量,而不是char
的数量。实际上,你已经设置了缓冲区溢出...
答案 2 :(得分:0)
我没有看到任何new
,所以我不希望任何delete
s。
我想我会查看SysAllocString()
的描述,看它是否分配了你需要的任何内存来摆脱你自己。