Вылет функции после выполнения

Тема в разделе "MS Visual C++", создана пользователем rudeman, 14 фев 2008.

  1. rudeman

    rudeman Гость

    Добрый день всем! Подскажите изза чего может возникать у меня ошибка.
    Функция следующего вида, часть моего *.ocx.
    Код (Text):
    typedef struct gss_buffer_desc_struct {
    size_t   length;
    void FAR * value;
    } gss_buffer_desc, FAR * gss_buffer_t;

    void COleLibCtrl::SubmitError()
    {
    int size;
    char message;
    OM_uint32 p_minor_status=0;
    gss_buffer_desc message_buffer;
    FILE* file;
    FILE* cfile;
    char* error_message = "d:/error_message.txt";
    char* error_size = "d:/acquire.txt";
    file = fopen( error_size, "r" );
    fscanf(file,"%d",&size);
    fclose(file);
    message_buffer.length=size;
    message_buffer.value=malloc(message_buffer.length);
    cfile = fopen(error_message, "r" );
    fgets(&message,message_buffer.length, cfile);
    fclose(cfile);
    message_buffer.value=&message;
    HINSTANCE hLIB;
    hLIB=LoadLibrary("C:/LIB.dll");
    ::PFN_MyFunction4 pfnMyFunction4;
    pfnMyFunction4=(PFN_MyFunction4)::GetProcAddress(hLIB,"OPEN_PROT");
    int iCode=(*pfnMyFunction4)(&p_minor_status,log_path,&hProtHandle);
    ::PFN_MyFunction5 pfnMyFunction5;
    pfnMyFunction5=(PFN_MyFunction5)::GetProcAddress(hLIB,"PROT");
    int iCode1=pfnMyFunction5(&p_minor_status, hProtHandle,&message_buffer);
    ::PFN_MyFunction6 pfnMyFunction6;
    pfnMyFunction6=(PFN_MyFunction6)::GetProcAddress(hLIB,"CLOSE_PROT");
    int iCode2=pfnMyFunction6(&p_minor_status,&hProtHandle);
    message_buffer.value=NULL;
    free(message_buffer.value);
    hProtHandle = NULL;
    ::FreeLibrary(hNGsec);
    }
    Судя по дебагу функция полностью отрабатывает, пишет что returned void, а потом идет вылет...
    Код (Text):
    First-chance exception in TSTCON32.EXE: 0xC0000005: Access Violation.
    Код (Text):
      74696E48  ???
    ->74696E49  ???
    74696E4A  ???
    Вроде все отработало, а вылет идет... Я просто в прострации ((
     
  2. Maxx

    Maxx Гость

    н-да

    зачем эта строка кода
    message_buffer.value=malloc(message_buffer.length);

    если потом делается так
    message_buffer.value=&message;

    при этом message объявлен как
    char message;

    и из файла читается в строка размером message_buffer.length в переменную размером в 1 байт
    fgets(&message,message_buffer.length, cfile);

    а тайный смысл этого я не постиг
    message_buffer.value=NULL;
    free(message_buffer.value);


    а кто проверять будет возвращаемые значения (например, из fopen, malloc и др) и
    выгружать dll
     
  3. rudeman

    rudeman Гость

    Ошибку нашел... достаточно "банальная" оказалась... malloc/new возвращает указатель на область памяти... и соответствующие free/delete освобождают выделеную память только по указателю, который вернулси после создания.А собсна message_buffer.value=&message; - все портило, переприсваивая указатель... в результате после выхода из функции была попытка очистить память "не ту"...
    Гуглил на эту тему и пришел к выводу что ошибки компилятора могли бы быть более информативны ))

    Maxx, спасиб за ответ, критика оправданая ) Но я просто выкладывал смесь "основного смысла" функции(без проверок, ибо они проходят все норм) и всякого отладочного муссора, который забыл закоментарить типа message_buffer.value=NULL; free(message_buffer.value); ))) Просто код пишу бардачно )))
     
  4. gamecreator

    gamecreator Гость

    без гугла могу сказать что прежде чем что-то использовать следует ознакомиться с тем, как его использовать и что оно делает.
     
Загрузка...

Поделиться этой страницей