WideStrig and Leaks Помогите пожалуйста
От: vasmann  
Дата: 08.04.06 09:45
Оценка:
Доброго времини суток.
Вы не могли бы помочь вот в таком деле:
Создать обыкновенное приложение, в одном из методов вставить приблизительно такой код:
procedure Test;
var
ws: WideString;
StringIndex: Integer;
const
BIG_STRING: WideString = '123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890' +
'123456789012345678901234567890123456789012345678901234567890';
STRINGS_COUNT = 1000;
begin
for StringIndex := 0 to STRINGS_COUNT — 1 do
begin
ws := ws + BIG_STRING;
end;
ws := '';
end;

Я знаю, код примитивный, но у меня он сьедает около 40Мб памяти. Я в полном замешательстве. Я знаю что принципы хранания String и WideString различны,
что при присвоении одного вайдстринга создается еще один, и в принципе логично куда уехало ~40МБ но вопрос, как мне эти 40Мб вернуть на родину?
Блин может я совсем уже запарился.
Спасибо.
Re: WideStrig and Leaks Помогите пожалуйста
От: Closer  
Дата: 08.04.06 12:15
Оценка:
Здравствуйте, vasmann, Вы писали:

V>Доброго времини суток.

V>Вы не могли бы помочь вот в таком деле:
V>Создать обыкновенное приложение, в одном из методов вставить приблизительно такой код:
V>procedure Test;
V>var
V> ws: WideString;
V> StringIndex: Integer;
V>const
V> BIG_STRING: WideString = '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890' +
V> '123456789012345678901234567890123456789012345678901234567890';
V> STRINGS_COUNT = 1000;
V>begin
V> for StringIndex := 0 to STRINGS_COUNT — 1 do
V> begin
V> ws := ws + BIG_STRING;
V> end;
V> ws := '';
V>end;

V>Я знаю, код примитивный, но у меня он сьедает около 40Мб памяти. Я в полном замешательстве. Я знаю что принципы хранания String и WideString различны,

V>что при присвоении одного вайдстринга создается еще один, и в принципе логично куда уехало ~40МБ но вопрос, как мне эти 40Мб вернуть на родину?
V>Блин может я совсем уже запарился.
V>Спасибо.

Попробуй вот такую команду, у меня после её выполнения в Delphi 5 размер отедаемой прогой памяти по показаниям Task Manager заметно уменьшался.

    // Уменьшаем размер памяти занимаемый программой
    SetProcessWorkingSetSize (GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Мы были здесь. Но пора идти дальше. (с) Дуглас Коупленд, Рабы "Микрософт"
Re: WideStrig and Leaks Помогите пожалуйста
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 09.04.06 02:21
Оценка:
Hello vasmann, you wrote:


> Я знаю, код примитивный, но у меня он сьедает около 40Мб памяти. Я в полном замешательстве. Я знаю что принципы хранания String и WideString различны


А разве нельзя сначала подсчитать размер итоговой строки, установить его, а уже потом заполнить строку. И быстрее в разы будет и память будет экономно расходоваться.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[2]: WideStrig and Leaks Помогите пожалуйста
От: vasmann  
Дата: 10.04.06 11:58
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Hello vasmann, you wrote:



>> Я знаю, код примитивный, но у меня он сьедает около 40Мб памяти. Я в полном замешательстве. Я знаю что принципы хранания String и WideString различны


SA>А разве нельзя сначала подсчитать размер итоговой строки, установить его, а уже потом заполнить строку. И быстрее в разы будет и память будет экономно расходоваться.


SA>--

SA>Всего хорошего, Слава
SA>ICQ: 197577902

Я понимаю что выделить память заранее лучше и оптимальнее. И этот пример я привел ни как отрывок из своего приложения, а как демонстрацию того что в делфи с WideString-ами какая-то гадость. В частности на этот код очень сильно ругается MemProof. И даже если преэлокейтид место — это не решает проблему а просто подстановка костыля — а это не есть гуд. Просто у меня в программе очень много WideString-ов и когда все средства показывают что нет утечек, а TaskManager говорит что у меня под 500Мб Виртуальной и 400Мб сьедено, то это уже не хорошо. При этом все AQTime MemProf да я уже в свои классы повставлял InstanceCounter тоже показывают что обьектов моих не так уж много и едят не много, но факт есть факт. и самое интересное что если использовать просто String — то все в ажуре.
В Общем проблема не приятная.
Re[2]: WideStrig and Leaks Помогите пожалуйста
От: vasmann  
Дата: 10.04.06 13:40
Оценка:
Здравствуйте, Closer, Вы писали:

C>Здравствуйте, vasmann, Вы писали:


V>>Доброго времини суток.

V>>Вы не могли бы помочь вот в таком деле:
V>>Создать обыкновенное приложение, в одном из методов вставить приблизительно такой код:
V>>procedure Test;
V>>var
V>> ws: WideString;
V>> StringIndex: Integer;
V>>const
V>> BIG_STRING: WideString = '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890' +
V>> '123456789012345678901234567890123456789012345678901234567890';
V>> STRINGS_COUNT = 1000;
V>>begin
V>> for StringIndex := 0 to STRINGS_COUNT — 1 do
V>> begin
V>> ws := ws + BIG_STRING;
V>> end;
V>> ws := '';
V>>end;

V>>Я знаю, код примитивный, но у меня он сьедает около 40Мб памяти. Я в полном замешательстве. Я знаю что принципы хранания String и WideString различны,

V>>что при присвоении одного вайдстринга создается еще один, и в принципе логично куда уехало ~40МБ но вопрос, как мне эти 40Мб вернуть на родину?
V>>Блин может я совсем уже запарился.
V>>Спасибо.

C>Попробуй вот такую команду, у меня после её выполнения в Delphi 5 размер отедаемой прогой памяти по показаниям Task Manager заметно уменьшался.


C>
C>    // Уменьшаем размер памяти занимаемый программой
C>    SetProcessWorkingSetSize (GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
C>


Судя по всему это помогает, по крайней мере при помощи этой функции память и виртуальная и обычная освобождаются. Но теперь второй вопрос, если у меня например рабочий обьем памяти порядка 150Мб, то наверно не стоит часто вызывать эту функцию.
В любом случае огромное спасибо.
Re: WideStrig and Leaks Помогите пожалуйста
От: vasmann  
Дата: 12.04.06 15:56
Оценка:
Здравствуйте, vasmann, Вы писали:
Собственно и ответ на вопрос, как говорится RTFM, поскольку WideString в Делфе это BSTR то имеем:
MSFN: Platform SDK: Automation: String Manipulation Functions
...
Automation may cache the space allocated for BSTRs. This speeds up the SysAllocString/SysFreeString sequence. However, this may also cause IMallocSpy to assign leaks to the wrong memory user because it is not aware of the caching done by Automation.

For example, if the application allocates a BSTR and frees it, the free block of memory is put into the BSTR cache by Automation. If the application then allocates another BSTR, it can get the free block from the cache. If the second BSTR allocation is not freed, IMallocSpy will attribute the leak to the first allocation of the BSTR. You can determine the correct source of the leak (the second allocation) by disabling the BSTR caching using the debug version of Oleaut32.dll, and by setting the environment variable OANOCACHE=1 before running the application.
...

Вот так вот, еще бы научиться освобождать эту память, ну или хотя бы частично освобождать.
Re[3]: WideStrig and Leaks Помогите пожалуйста
От: Аноним  
Дата: 14.04.06 10:34
Оценка:
Здравствуйте, vasmann, Вы писали:


V>Я понимаю что выделить память заранее лучше и оптимальнее. И этот пример я привел ни как отрывок из своего приложения, а как демонстрацию того что в делфи с WideString-ами какая-то гадость. В частности на этот код очень сильно ругается MemProof. И даже если преэлокейтид место — это не решает проблему а просто подстановка костыля — а это не есть гуд. Просто у меня в программе очень много WideString-ов и когда все средства показывают что нет утечек, а TaskManager говорит что у меня под 500Мб Виртуальной и 400Мб сьедено, то это уже не хорошо. При этом все AQTime MemProf да я уже в свои классы повставлял InstanceCounter тоже показывают что обьектов моих не так уж много и едят не много, но факт есть факт. и самое интересное что если использовать просто String — то все в ажуре.

V>В Общем проблема не приятная.

Не могу сказать наверняка насчёт MemProof.Но в Turbo Power Sleuth CodeWatch3 (который,насколько мне известно генерирует похожие на MemProof результаты) это ошибка самого профайлера.
Вот что на этот счёт можно найти по адресу "http://groups.google.ru/group/turbopower.public.support.sleuthqa/browse_thread/thread/edb1c6a61f5a7d6/c84e4d0f194f993f%23c84e4d0f194f993f":

От: Per Larsen [TurboPower] — просмотр профиля
Дата: Пн. 5 Авг. 2002 13:13
Группы: turbopower.public.support.sleuthqa

Anton,

Yes, now there is. Sorry I've been away on vacation.
This is not a real leak. The memory handle is passed to the
CreateILockBytesOnHGlobal API function, which takes care of freeing it.
CodeWatch doesn't check that. That's an oversight, which will be fixed
in the next point release.


Sorry for the inconvenience.


— Per



"Anton Santa" <s...@sabesoft.it> wrote in message


news:g7IUex0LCHA.3716@tpsmail01.turbopower.net...


То есть с WideString проблема есть. Но по всей видимости, в конечном итоге память всё-таки освобождается.Просто профилировщики оказываются не в состоянии факт освобождения памяти отследить.
И не ищите

next point release

для Sleuth. Через полгода после процитированного поста TurboPower закрылась..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.