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

  • Автор темы Автор темы Guest
  • Дата начала Дата начала
G

Guest

Код:
//Удаляет из строки 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, но если не очищать память, то происходит утечка памяти и зависание компа.
 
Разумеется, раз ты память удалил, какой ты ожидаешь там результат? Так что удалять нельзя. Если функция выделяет память для результата, занчит удалять ее должна вызывающая сторона:
Код:
for... 
{
LPTSTR sRet = F1(s1, s2);
delete[] sRet;
}
А падать программа может потому что
Код:
ss[i+j]!=s[j]
будет обращаться за конец основной строки.
 
Значит, как я понял, переменная, которая получает результат функции F1() и отвечает за ту динамическую память, которую использует функция F1() ?

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

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

Кстати, а от чего зависит скорость обработки данных? Частота процессора? Объём памяти процессора? Оперативной памяти?
 
Уж лучше тогда выделять память сразу, перед вызовом функции. А то так и запутаться можно, как удалять или free или delete или delete []
 
Толстый
Защищаться лучше не делая лишние проверки на каждой итерации, а изменив границы цикла :)
 
Ну все тебе разжуй :) А подумать? Хинт: сколько раз надо проверять что "подстрока" входит в "строка"?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!