Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pchar Замена подстроки в строке 
:(
    Опции темы
lollollollol
Дата 3.4.2013, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



buff не глобальная переменная. Но для записи в неё, я передаю указатель.

Обновил прошлое сообщение.
Может быть проблема в том что я так записываю в функции:

string(result^):=string(result^)+code;

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:03
PM MAIL   Вверх
Чучмек
Дата 3.4.2013, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(lollollollol @  3.4.2013,  16:56 Найти цитируемый пост)
procedure xxxxxxxxxxxxx(Result:Pointer);
   while (Условие) do begin
      string(result^):=string(result^)+code;
   end;
end;

Что за кака?
Код

procedure xxxxxxxxxxxxx(var S:String);
begin
   while (Условие) do begin
      S:=S+code;
   end;
end;



Это сообщение отредактировал(а) Чучмек - 3.4.2013, 17:13


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Извиняюсь, думал что нельзя так указатели использовать.
А пример подобного кода(как у меня) я вычитал на каком-то форуме.

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:10
PM MAIL   Вверх
Чучмек
Дата 3.4.2013, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Не правильно передаешь строки. Строка имеет внутренний счетчик ссылок. Менеджер памяти освобождает выделенную под строку память, когда счетчик ссылок равен нулю.

Добавлено @ 17:14
Цитата(lollollollol @  3.4.2013,  17:09 Найти цитируемый пост)
думал что нельзя так указатели использовать

Моя невнимательность. var S:string;

Это сообщение отредактировал(а) Чучмек - 3.4.2013, 17:15


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Исправил, всё по прежнему 
PM MAIL   Вверх
Beltar
Дата 3.4.2013, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Код

procedure xxxxxxxxxxxxx(Result:Pointer);
   while (Условие) do begin
      string(result^):=string(result^)+code;
   end;
end;


 smile 

Никаких пойнтеров к стрингам, если ТОЧНО не знаешь, что делаешь.
Вообще срочно читать учебник для начинающих.

Что мешает по-русски написать?

Код

procedure xxxxxxxxxxxxx(var S:String);
   while (Условие) do begin
      S:=S+code;
   end;
end;


А лучше

Код

function xxxxxxxxxxxxx(const S:String):String;
begin
Result:=S;
{Если число итераций велико, но предел длины результата предсказуем, то можно сразу выделить всю память строке, после цикла укоротить}
   while (Условие) do begin
      Result:=Result+code;
   end;
end;




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Чучмек
Дата 3.4.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(Beltar @  3.4.2013,  17:34 Найти цитируемый пост)
А лучше

А чем лучше?

Добавлено через 7 минут и 20 секунд
Цитата(lollollollol @  3.4.2013,  17:27 Найти цитируемый пост)
Исправил, всё по прежнему
 А еще подобные конструкции есть.
lollollollol, 
Поставь перед end;
Код

ShowMessage(inttostr(PInteger(PChar(buff)-2*4)^));

Должно выводить единицу.





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



От подобных уонструкций избавился, сделал как ты показал. результат


-2054110216


Забыл добавить, код выполняется в потоке, то есть я на каждый запрос браузера выделаю поток. 

Код

    while true do begin
      size := SizeOf(client);
      conn := accept(sock,@client,@size);
      if (conn<>SOCKET_ERROR) then  begin
        ThID:=CreateThread(nil,0,@StartHTTPServer,pointer(conn),0,tid);
        CloseHandle(ThID); //Не помню где, но видел что советуют закрывать хендл потока сразу. Хотел спросить, на сколько это корректно/безопасно?
        sleep(10);
      end;
    end;


И уже в потоке работаю с перменной buff:string;


Делал так:

Код

          buff:=buff+'</body></html>';                                          
          send(recvsock,buff[1],length(buff),0);
          buff:='';
        end;
      end;
    end;
  end;
  Shutdown(recvsock, SD_BOTH);
  closesocket(recvsock);
  ShowMessage(inttostr(PInteger(PChar(buff)-2*4)^)); //-2054110216                                                            
  ExitThread(0);
end;


Это сообщение отредактировал(а) lollollollol - 3.4.2013, 18:07
PM MAIL   Вверх
Beltar
Дата 3.4.2013, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Тем, что если один возвращаемый параметр, то через функцию банально лучше воспринимается, хотя процедурка тут побыстрее должна быть.

Цитата

ThID:=CreateThread(nil,0,@StartHTTPServer,pointer(conn),0,tid);
        CloseHandle(ThID);


А поток по завершении совершит самоубийство? Если нет, то все, утечка раз дескриптор потерян.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Beltar, даже если так не делать, ничего не меняет, проверил. и утечка таже, и -2054110216  
PM MAIL   Вверх
Beltar
Дата 3.4.2013, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Ты вызываешь ф-ию WinAPI, ее утечки дельфовым менеджером памяти не отловить. Можно MemProof по пробовать.
По алгоритму отладчик в помощь, но сначала переписать все без указателей.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Чучмек
Дата 3.4.2013, 18:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(lollollollol @  3.4.2013,  18:19 Найти цитируемый пост)
и -2054110216   

Это нормально. Это из за
Цитата(lollollollol @  3.4.2013,  17:56 Найти цитируемый пост)
 buff:='';

Здесь не должно быть больше 1.
Твоя проблема в потоках.
ExitThread не возвращает управление. Соответственно не выполняется код, который добавляет делфа для освобождения строк, по завершении функции.

Добавлено @ 18:38
Закоментируй строку
Цитата(lollollollol @  3.4.2013,  17:56 Найти цитируемый пост)
 ExitThread(0);
, и проверь

Добавлено @ 18:44
Сделай так:
Код

procedure MyProc;
var
  s1,
  s2,
  sn:string;
begin
{ здесь работа со строкам }
end;

function ThtradProc(p:pointer):cardinal;stdcall;
begin
  MyProc;
  ExitThread(0);
end;
 

Это сообщение отредактировал(а) Чучмек - 3.4.2013, 18:45


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Чучмек, спасибо!!!

Закоментировал строку
Код

ExitThread(0);


и утечка пропала. память возвращает в норму, прям до байтика!


Вот уж не думал что проблема в этом... Огромное спасибо!

Добавлено через 9 минут и 58 секунд
Интересует вопрос. Всё ли корректно с потоком, если не вызывать ExitThread(0);,
и не повредит ли закрытие хендла сразу после создания потока?

Не смог найти статью, но читал что такое действие спасает от утечки при завершении потока.

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 18:57
PM MAIL   Вверх
Чучмек
Дата 3.4.2013, 20:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата(lollollollol @  3.4.2013,  18:57 Найти цитируемый пост)
Интересует вопрос. Всё ли корректно с потоком, если не вызывать ExitThread(0);,

Во первых решается.
Цитата(Чучмек @  3.4.2013,  18:36 Найти цитируемый пост)
Сделай так:

Во вторых - корректно.
Код

ExitThread(0);
 эквивалентно
Код

result:=0;

Функция ThreadProc 
Цитата(lollollollol @  3.4.2013,  18:57 Найти цитируемый пост)
и не повредит ли закрытие хендла сразу после создания потока?

Не повредит.
Цитата

Объект потока остается в системе, до тех пор, пока не поток закончит работу, и все дескрипторы к нему не будут закрыты через вызов CloseHandle.

Функция CreateThread


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Цитата

Сделай так:

Я сразу так сделал, как увидел Ваше сообщение.

Но остался вопрос, получается если сделать так как вы показали, и сразу закрыть хендл, как это сделано у меня, то можно не бепокоиться о том, что объект потока может быть не закрыт?

Я знаю что в системе есть ограничение на потоки для одного процесса.
И если буду висеть примерно 2000 объектов потоков, то новые потоки созданы не будут.



P.S. Думаю тему будет разумно переименовать в Утечка памяти, String, Потоки
или что нибудь подобное, чтобы люди могли найти решение

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 20:53
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.