Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 23:25   #1
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию Утечка памяти.

Здравствуйте. С наступающим Новым Годом

Я создаю морфологический анализатор с помощью уже готовых библиотек от AOT.
Так вот, при написании следующей функции(см ниже) появляется утечка памяти:
Код:
String GetMorphDetail(const String SrcAncodes)
{
	WideString OneAncode;
	unsigned char ch;
	int i(1);
	__int64 j(0);
	String Result("");
	while(i < SrcAncodes.Length())
	{
		OneAncode = SrcAncodes.SubString(i, 2);
		Form1->RusGramTab->GetPartOfSpeech(OneAncode, ch);
		Form1->RusGramTab->GetPartOfSpeechStr(ch, OneAncode); // утечка
		Result = OneAncode + "=";
		OneAncode = SrcAncodes.SubString(i, 2);
		//Form1->RusGramTab->GetGrammems(OneAncode, j);
		//Form1->RusGramTab->GrammemsToStr(j, OneAncode); // утечка
		Result += OneAncode;
		i += 2;
	}
	return Result;
}
Вызывается эта функция в следующем коде:
Код:
String speech(""), info("");
::CoInitialize(NULL);
String OneAncode;
for(int f = 0; f < Memo1->Lines->Count; f++)
{
	RusLemmatizer->CreateParadigmCollectionFromForm(Memo1->Lines->Strings[f].Trim(), 1, 1, ParadigmCollection);
	if(ParadigmCollection->Count > 0)
	{
		for (int i = 0; i < ParadigmCollection->Count; i++)
		{
			for(unsigned int j = 0; j < ParadigmCollection->Item[i]->Count; j++)
			{
				info = GetMorphDetail(ParadigmCollection->Item[i]->Ancode[j]);
				info = "";
			}
		}
	}
	ParadigmCollection->Release();
}
::CoUninitialize();
Много раз проверил, если следующие строчки не закомментированы, то память утекает неимоверно быстро.
Код:
Form1->RusGramTab->GetPartOfSpeechStr(ch, OneAncode);
Form1->RusGramTab->GrammemsToStr(j, OneAncode);
CodeGuard ничего не находит.

Вот так они объявлены в заголовочном h файле:

Код:
virtual HRESULT __safecall GetPartOfSpeechStr(System::Byte PartOfSpeech, System::WideString &__GetPartOfSpeechStr_result) = 0 ;
virtual HRESULT __safecall GrammemsToStr(__int64 grammems, System::WideString &__GrammemsToStr_result) = 0 ;
Вот так они выглядят в pas файле:
Код:
function TGerGramTab.GetPartOfSpeechStr(PartOfSpeech: Byte): WideString;
begin
  Result := DefaultInterface.GetPartOfSpeechStr(PartOfSpeech);
end;

function TRusGramTab.GrammemsToStr(grammems: Int64): WideString;
begin
  Result := DefaultInterface.GrammemsToStr(grammems);
end;
Может быть в этой части теряется память?
Код:
System::WideString &__GetPartOfSpeechStr_result
System::WideString &__GrammemsToStr_result
Как думаете?

Буду рад любой помощи Разобраться бы с этой проблемой в этом году, чтобы в новый 2016 ее не тащить
Gdasar вне форума Ответить с цитированием
Старый 26.12.2015, 09:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А как выглядит тело GetPartOfSpeechStr, на которую в интерфейсе идет обращение?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2015, 14:32   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Может надо очищать переменную OneAncode перед вызовом?
waleri вне форума Ответить с цитированием
Старый 26.12.2015, 16:20   #4
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А как выглядит тело GetPartOfSpeechStr, на которую в интерфейсе идет обращение?
Я не знаю

Я получил 2 pas файла из dll. Далее просто добавил их к проекту и получил используемые h файлы(см аттач).

Само приложение работает "отлично" - выполняет морфологический анализ, но только где-то память утекает.

Цитата:
Может надо очищать переменную OneAncode перед вызовом?
Пробовал. Но методом исключения я определил 2 строчки, где происходит утечка(или не определил?).
Вложения
Тип файла: zip Desktop.zip (20.3 Кб, 10 просмотров)
Gdasar вне форума Ответить с цитированием
Старый 26.12.2015, 16:23   #5
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Сами dll, откуда я получил pas файлы.
Вложения
Тип файла: zip agramtab.zip (180.1 Кб, 9 просмотров)
Тип файла: zip Lemmatizer.zip (443.0 Кб, 9 просмотров)
Gdasar вне форума Ответить с цитированием
Старый 26.12.2015, 17:05   #6
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Что то странное. Может либа кривая? Указателей то в тексте не видно.
taras-proger вне форума Ответить с цитированием
Старый 27.12.2015, 14:33   #7
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Здравствуйте.
Я чуть изменил функцию - добавил Sleep(10)
Код:
String GetMorphDetail(const String SrcAncodes)
{
	unsigned char ch;
	WideString OneAncode("");
	int i(1);
	__int64 j(0);
	String Result("");
	while(i < SrcAncodes.Length())
	{
		OneAncode = SrcAncodes.SubString(i, 2);
		Form1->RusGramTab->GetPartOfSpeech(OneAncode, ch);
		Sleep(10);
		Form1->RusGramTab->GetPartOfSpeechStr(ch, OneAncode); // утечка
		Result = OneAncode + "=";
		/*OneAncode = SrcAncodes.SubString(i, 2);
		Form1->RusGramTab->GetGrammems(OneAncode, j);
		//Form1->RusGramTab->GrammemsToStr(j, OneAncode); // утечка
		Result += OneAncode;*/
		i += 2;
	}
	return Result;
}
И по диспетчеру стал наблюдать, как возрастает потребление памяти. Первые секунды память не изменяется, но потом начинает увеличиваться на 4 Кб каждую секунду.

P.S. не знаю, к чему я это ляпнул, просто на столько я продвинулся в решении данной проблемы... Я все еще топчусь на месте.
Gdasar вне форума Ответить с цитированием
Старый 14.01.2016, 10:40   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
Form1->RusGramTab->GetPartOfSpeech(OneAncode, ch);
и
Код:
Form1->RusGramTab->GetPartOfSpeechStr(ch, OneAncode);
Посмотреть в отладчике значение переменной OneAncode в процессе выполнения цикла.

Код:
Result = OneAncode + "=";
Здесь у Вас что? Последнее значение переменной OneAncode? Тогда можно вынести
за тело цикла. А так подозрение на GetPartOfSpeechStr.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 14.01.2016, 10:54   #9
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Вообще тело цикла довольно странное:
Код:
while(i < SrcAncodes.Length())
	{
		OneAncode = SrcAncodes.SubString(i, 2); // присвоили значение переменной OneAncode
		Form1->RusGramTab->GetPartOfSpeech(OneAncode, ch);//чет делаем с переменной
		Form1->RusGramTab->GetPartOfSpeechStr(ch, OneAncode); // утечка
		Result = OneAncode + "=";// присваиваем Result значение переменной OneAncode и "=", т.е. на следующем проходе цикла мы обнулили 
                    Result с конактекированным значением и присвоили новое значение OneAncode и "=".
		OneAncode = SrcAncodes.SubString(i, 2);// опять присвоили значение то же переменной OneAncode
		//Form1->RusGramTab->GetGrammems(OneAncode, j);
		//Form1->RusGramTab->GrammemsToStr(j, OneAncode); // утечка
		Result += OneAncode; //конактенация OneAncode с Result; 
		i += 2;
	}
Вы определитесь че надо та?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 26.01.2016, 23:21   #10
HelloWold
Пользователь
 
Регистрация: 16.09.2015
Сообщений: 21
По умолчанию

Krok27, здравствуйте.
Данная функция была переписана по подобию этого кода на Delphi
Код:
  function GetMorphDetail(const SrcAncodes: string): string;
  var
    OneAncode: string;
    i: integer;
  begin
    Result := '';
    i := 1;
    while  i < Length(SrcAncodes) do
      begin
        OneAncode := Copy(SrcAncodes, i, 2);
        if Result <> '' then
          Result := Result + ' ';
        Result := Result + ' ' + RusGramTab.GetPartOfSpeechStr(RusGramTab.GetPartOfSpeech(OneAncode)) + '=' + RusGramTab.GrammemsToStr(RusGramTab.GetGrammems(OneAncode));
        i := i + 2;
      end;
  end;
Ниже прикрепил заголовочные файлы + cpp.
Может я не верно перевел функцию с Delphi?

На вход функция получает:
Код:
аа
аб
ав
аг
ад
аж
аз
аи
ай
ак
ал
На выходе выдает:
Код:
С=мр,пр,ед,
С=мр,им,мн,
С=мр,рд,мн,
С=мр,дт,мн,
С=мр,вн,мн,
С=мр,тв,мн,
С=мр,пр,мн,
Вложения
Тип файла: zip morph.zip (15.8 Кб, 11 просмотров)

Последний раз редактировалось HelloWold; 26.01.2016 в 23:41.
HelloWold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти OmegaBerkut Общие вопросы Delphi 21 09.04.2015 22:12
утечка памяти Кудаив Помощь студентам 1 30.04.2012 18:18
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Утечка памяти ZvEr_HaCkEr Свободное общение 13 24.09.2010 19:30
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24