Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > strtok и new


Автор: День 28.11.2005, 09:11
привет всем.
Есть такой код

Код

int main(int arc, char **argv)
{
    MainFunc();
    return 0;
}

void MainFunc()
{
    int pid;
    if ((pid = fork()) == -1)
    {
        printf("err: Fork");
        return;
    }
    if (pid == 0)
        ...
        split(....);
        ...
    else
    {
        wait(&status) и проверка кода завершения
    }
}



int split (char* massive[], int massive_size, char* str, char* delim)
{
    int j = 0;
    char *workstr = new char [strlen (str) + 1];
    char *temp;
    bzero (workstr, strlen (str) + 1);
    strcpy (workstr, str);
    temp = workstr;
    char *token = strtok (temp, delim);

    while ((token != NULL) && (j < massive_size))
    {
        massive [j] = new char [strlen (token)+1];
        if (long (massive[j]) == 0)
        {
            printf("err: Memory %d\n",strlen(token)+1);
            delete workstr;
            return -1;
        }
        bzero (massive [j], strlen(token)+1);
        strcpy (massive [j], token);
        printf("!%s!\n", massive [j]);
        j++;
        
        token = strtok (NULL, delim);
    }
    delete workstr;

    return j;
}


дочерний процесс завершается с кодом 0 по сигналу 11 - ошибка обращения к памяти.
дочерний процесс только один

где у меня косяк?
Я еще неопытен, потому прошу ногами больно не бить, если что smile

буду рад любому мнению по поводу кода.

Автор: comcon1 30.11.2005, 19:21
Не разбирался, но скажу - strtok коряво реализована во многих *NIX-ах. У меня в ман-е написано:
Код

BUGS
       Never use these functions. If you do, note that:

              These functions modify their first argument.

              These functions cannot be used on constant strings.

              The identity of the delimiting character is lost.

              The strtok() function uses a static  buffer  while  parsing,  so
              it's not thread safe. Use strtok_r() if this matters to you.


Удачи!

Юзай boost::tokenizer. Могу кинуть пример, если будет желание.

Автор: oberonchik 5.12.2005, 20:26
Цитата(comcon1 @ 30.11.2005, 19:21)
strtok коряво реализована во многих *NIX-ах

не корректно так говорить -она реализована во-первых везде одинаково, а во-вторых не-коряво(насколько это и должно быть)
просто она НЕ дла многопоточных приложений
в многопоточных исользуют strtok_r которой если память не изменяет(лень лазить в man) надо передовать доп буфер (для её жизнедеятельности)

Автор: День 7.12.2005, 21:36
Не поверите smile
поменял new на malloc и ошибка исчезла!
Когда стал тестировать программу на нескольких дочерних процессах, переписал strtok на strtok_r - и все ОК.

подскажите boost на каких условиях распространяется и где ее можно скачать?

Автор: AndrK 13.7.2006, 11:29
При выделении массива с помощью new, он должен удаляться как массив, а не как динамическая переменная...

char* buff=new char[10];
//... что-то делаем ...
delete[] buff;

Обрати внимание на последнюю строку... именно delete[], а не delete...

З.Ы.
Но это не должно давать ошибку обращения к памяти (хотя возможно я ошибаюсь),
это просто первое что бросилось в глаза, если это пренципиально, то пройдись дебагером,
узнаешь где прога вылетает... 

Автор: bsa 14.7.2006, 13:51
Цитата(День @ 7.12.2005,  21:36)
подскажите boost на каких условиях распространяется и где ее можно скачать?

http://www.boost.org/LICENSE_1_0.txt 

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