Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > unhadled exception при вызове free()


Автор: Тутанхамец 22.1.2006, 13:52
Господа, прошу помощи. Есть процедура. Не так уж важно, что она делает, но выглядит она так:

Код


int GetNum(){
    int i=0,n=0,exp=0, aexp=0, sigh=1;
    int zc;
    char ipart[32];
    char * mant=(char *)malloc(25*sizeof(char));
    char * sz;
    char * rez;
    double num;
    int startpow;
    memcpy(mant, &setka[8], 24);
    mant[24]=0;

    exp=GetPol(&setka[0], 1,7,6)-64;
    aexp=abs(exp);
    if (aexp>24) zc=aexp-24; else zc=0;
    sz=(char *)malloc((zc+1)*sizeof(char));        
    memset(sz,48,zc);
    sz[zc]=0;
    
    
    if (exp<0)
    {rez=strcat(mant, sz); startpow=aexp-1;}
    else
    {rez=strcat(sz,mant); startpow=-1;}
    
    
    num=GetPol(rez,0,aexp,startpow);

    // до этих строк всё выполняется правильно, но на первом же free возникает ошибка
    free(rez);
    free(sz);
    free(mant);
    
    

return 0;
}


Как только прога доплюхивает до первого free, возникает unhadled exception.... access violation по адресу. Кто-нибудь знает, что я не так делаю? Заранее благодарен.
Добавлено @ 13:54
Чтоб вы все-таки не подумали, что я что-то скрываю smile , то эта процедура вытаскивает вещественное число из массива, который эмулирует 32-разрядную ячейку памяти без обратного и дополнительного кода.

Автор: Earnest 22.1.2006, 14:03
Что-то я не увидела кода, который выделяет память указателю rez. А free ты вызываешь...
Может ты думаешь, что strcat память выделяет? Это не так...


Автор: Тутанхамец 22.1.2006, 14:42
Вообще-то, да. Я думал, что раз уж strcat куда-то склеенное помещает, то она и выделяет сама, и указатель на тот адрес дает.

Попробовал так:

Код

                lrez=strlen(mant)+strlen(sz)+1;
    rez=(char *)malloc(lrez*sizeof(char));
    
    if (exp<0)
    {rez=strcat(mant, sz); startpow=aexp-1;}
        else
    {rez=strcat(sz,mant); startpow=-1;}
    
    
    
    num=GetPol(rez,0,aexp,startpow);
    
    free(rez);
    free(sz);
    free(mant);
    


Картина та же - исключение никуда не девается. Интересно, что так случается не только для rez, а и для двух других указателей.

У меня есть версия, но я в Сях чайник, так что не знаю, насколько она дурацкая.

После "rez=strcat(mant, sz); startpow=aexp-1;"
rez и mant указывают на один блок памяти так? А потом я пытаюсь один и тот же блок освободить два раза? Может, из-за этого?





Автор: Тутанхамец 22.1.2006, 15:02
Всё, проблема решена. Оказывается, при вызове strcat, в первой склееваемой строке должно быть место для второй. Первая юзается как буфер. А я думал, сумма строк складывается в какое-то другое место. В общем, всё заработало в таком вот виде:

Код

lrez=strlen(mant)+strlen(sz)+1;
    rez=(char *)malloc(lrez*sizeof(char));
    
    if (exp<0)
    {memcpy(rez,mant,24); memcpy(rez+24,sz,zc); startpow=aexp-1;}
        
        else
    {memcpy(rez,sz,zc); memcpy(rez+zc,mant,24); startpow=-1;}
    
    num=GetPol(rez,0,aexp,startpow);
    
    
    free(sz);
    free(mant);
    free(rez);
    


Earnest, спасибо)

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