Когда мне нужно освободить память? - PullRequest
0 голосов
/ 26 мая 2010

Я использую этот код внутри класса, чтобы веб-браузер контролировал посещение веб-сайта:

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);
}

Я вызываю visitWeb из другой void-функции, которая вызывается в handlemessage () для приложения. Нужно ли здесь выполнить некоторое освобождение памяти? Я вижу, что vURL освобождается VariantClear, но мне следует освободить память для буфера? Мне сказали, что в другом буле, который есть в том же приложении, я не должен ничего освобождать, потому что все очищается, когда бул возвращает true / false, но что происходит с этим пустым пространством?

Ответы [ 3 ]

5 голосов
/ 26 мая 2010

Я думаю, у вас есть некоторые фундаментальные проблемы с вашим пониманием управления памятью. В этом случае нет, вам не нужно явно освобождать какую-либо память. Вы никогда не звонили new, поэтому вам не нужно звонить delete. buffer существует только в стеке и исчезнет, ​​когда этот метод вернется.

3 голосов
/ 26 мая 2010

Если бы я мог, я бы предложил сделать это немного по-другому - я бы начал с создания небольшого класса:

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 s. Вы установили переполнение буфера ...

0 голосов
/ 26 мая 2010

Я не вижу new с, поэтому не ожидал бы delete с.

Полагаю, я бы посмотрел описание SysAllocString(), чтобы определить, выделяет ли оно какую-либо память, от которой вам нужно избавиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...