Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > удаление const char*


Автор: isergey 24.7.2010, 02:56
Друзья, помогите, может я чего-то не понимаю, но есть вот такой кусок кода:
Код

void ZConnection::connect(const string &hostname, int portnum){

    ZOOM_connection_connect(this->zc, hostname.c_str(), portnum);
    int errcode;
    const char *errmsg;     // unused: carries same info as `errcode'
    const char *addinfo;
    if ((errcode = ZOOM_connection_error(this->zc, &errmsg, &addinfo)) != 0) {
     string emessage(errmsg);
     string eaddinfo(addinfo);
     string message = emessage + " " + eaddinfo;
        throw ZConnectionException(message, errcode);
    }

}


Интересует меня следующая проблема, как освободить память из-под указателей errmsg и addinfo. Эти указатели заполняются в функции ZOOM_connection_error информацией об ошибке. Далее происходит формирование исключения на основе этой информации и выброс его. Что происходит с нашими указателями? Как я понимаю, при таком положении дел (как в листинге) происходит утечка памяти?

Автор: Dem_max 24.7.2010, 07:25
А почему именно константные указатели ? и почему указатели есть а выделенной памяти по этим указателям нету ?

Автор: EgorTheBlade 24.7.2010, 09:03
"Как я понимаю, при таком положении дел (как в листинге) происходит утечка памяти? "
Используйте в вашем случае smart_ptr.

Автор: djamshud 24.7.2010, 10:37
Вы уверены, что ZOOM_connection_error принимает именно указатели на константы?
Вы уверены, что он выделяет под них память, а не просто присваивает значения внутренних статических указателей?

Если оба ответа утвердительны, узнайте, как он выделят память (malloc или new) и освободите ее (free или delete соответственно), освободив тип от константности через const_cast. А потом тут же пошлите лучи ненависти и негодования тому, кто написал эту функцию, оформленные в багрепорте

Автор: Modul 24.7.2010, 13:54
Примерчик:

Код

#include <stdio.h>
#include <stdlib.h>


int main()
{

    int *p1;
    p1 = (int *)malloc(5 * sizeof(int) );

    for(int i=0; i<5; i++)
        p1[i] = i;


    for(int j=0; j<5; j++)
      printf("%d\n", p1[j]);

    free(p1);


    return 0;
}

Автор: isergey 24.7.2010, 14:01
Принимаются именно статические указатели. Вобщем полез я в недры и узрел, что значения этим указателям присваиваются функцией, примерно так:
Код

ZOOM_API(const char *)
    ZOOM_diag_str(int error)
{
    switch (error)
    {
    case ZOOM_ERROR_NONE:
        return "No error";
    case ZOOM_ERROR_CONNECT:
        return "Connect failed";
    case ZOOM_ERROR_MEMORY:
        return "Out of memory";
                    ...

Автор: W4FhLF 24.7.2010, 14:51
Тогда ничего удалять не надо. 

Автор: bsa 27.7.2010, 14:51

M
bsa
isergey, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)