Как вернуть результат работы динамической памяти?

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 21 сен 2008.

  1. Гость

    Код (Text):
    //Удаляет из строки ss все подстроки s
    char *F1(char *ss, char *s)
    {
    int n=strlen(ss)+1;   //длина строки
    int m=strlen(s);         //длина подстроки
    bool key;
    char *sss=new char[n];
    int k=0;
    for(int i=0; i<n; i++)
    {
    if(ss[i]==s[0])      //если i-символ строки == [0]-символу подстроки
    {
    key=true;            //подстрока, наверное, найдена
    for(int j=1; j<m; j++)
    {
    if(ss[i+j]!=s[j])  //если i+j-символ строки != [j]-символу подстроки
    {
    key=false;      //подстрока не найдена
    break;
    }
    }
    if(key==false)  //если подстрока не найдена
    {
    sss[k]=ss[i];  //запись i-символа ss в строку sss
    k++;            //увеличение индекса строки sss
    }
    else i+=m-1;
    }
    else
    {
    sss[k]=ss[i];
    k++;
    }
    }
    delete [] sss;
    return sss;
    }

    void main()
    {
    char *s1="help help help help help help";
    char *s2="lp";
    for(long i=0; i<1000000; i++)//цикл для определения времени работы функции
    F1(s1,s2);
    }
    //Возвращает не совсем правильный результат, наверное, потому что был удалён указатель sss, но если не очищать память, то происходит утечка памяти и зависание компа.
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Разумеется, раз ты память удалил, какой ты ожидаешь там результат? Так что удалять нельзя. Если функция выделяет память для результата, занчит удалять ее должна вызывающая сторона:
    Код (Text):
    for...
    {
    LPTSTR sRet = F1(s1, s2);
    delete[] sRet;
    }
    А падать программа может потому что
    Код (Text):
    ss[i+j]!=s[j]
    будет обращаться за конец основной строки.
     
  3. Гость

    Значит, как я понял, переменная, которая получает результат функции F1() и отвечает за ту динамическую память, которую использует функция F1() ?

    У меня зависание компа происходило из-за малой оперативки (128Mb) - сильно шуршал винчестер, а когда я зделал, как вы предложили - винчестера небыло слышно.

    А то, что при "ss[i+j]!=s[j]" может быть выход за основную строку, то это иногда может дать сбой, если за основной строкой случайно окажутся символы, как и в удаляемых подстроках. Но можно защититься, если во втором цикле сделать сравнение: j<m && (i+j)<n; при этом время работы функции увеличится на 4,62 сек/100млн циклов до 155,44 сек/100млн (процессор: Селерон-600)

    Кстати, а от чего зависит скорость обработки данных? Частота процессора? Объём памяти процессора? Оперативной памяти?
     
  4. destr

    destr Гость

    Уж лучше тогда выделять память сразу, перед вызовом функции. А то так и запутаться можно, как удалять или free или delete или delete []
     
  5. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Толстый
    Защищаться лучше не делая лишние проверки на каждой итерации, а изменив границы цикла :)
     
  6. Гость

    А как изменить границы, если пределы 'n' и 'm' ?
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ну все тебе разжуй :) А подумать? Хинт: сколько раз надо проверять что "подстрока" входит в "строка"?
     
Загрузка...

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