我什么时候需要释放内存?

时间:2010-05-25 20:58:47

标签: c++ visual-c++ memory-management

我在一个类中使用此代码来让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时,一切都清楚了,但是这个空白会发生什么?

3 个答案:

答案 0 :(得分:5)

我认为您对内存管理的理解存在一些基本问题。在这种情况下,不,您不需要显式释放任何内存。您没有致电new,因此您无需致电deletebuffer仅存在于堆栈中,并且在此方法返回时将消失。

答案 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()的描述,看它是否分配了你需要的任何内存来摆脱你自己。