purebasic.info

PureBasic forum
Текущее время: Ср июл 24, 2019 7:49 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вс апр 28, 2019 1:21 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
Ну вы молодцы
Код:
1
2
3
4
5
6
7
8
9
10
11
 
Procedure test()
  s.s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
  !nop
  !nop
  s2.s = PeekS(@s)
  !nop
  !nop
EndProcedure
test()
 


Это по сути 2-е глобальных переменных поэтому можно и не возвращать,записанные строки естественно останутся.
да и писать в них без увеличение млн раз одно и тоже смысла нет,понятно что память не изменится. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вс апр 28, 2019 6:54 pm 
Не в сети
ассистент

Зарегистрирован: Сб фев 02, 2019 9:46 pm
Сообщений: 13
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Kuzmat писал(а):
память не течет

Не течет, да, но и не освобождается.

Сергейчик писал(а):
2-е глобальных переменных

Что за бред? Может покажешь, как ты будешь писать в эти переменные и потом читать из них?
Да хоть Protected'ом объяви, все равно останется в памяти.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вс апр 28, 2019 8:03 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
zonix писал(а):
Kuzmat писал(а):
память не течет

Не течет, да, но и не освобождается.

Сергейчик писал(а):
2-е глобальных переменных

Что за бред? Может покажешь, как ты будешь писать в эти переменные и потом читать из них?
Да хоть Protected'ом объяви, все равно останется в памяти.

Если компилятор считает это за ошибку то это не значит что её нет в памяти
тем более если он её скомпилит как статичискую(зарезервировав размер) в блок данных
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Global *stroka
Procedure test()
 
    s.s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    *stroka=@s
    Debug PeekS(*stroka,-1,#PB_Unicode)
 
EndProcedure
test()
Debug PeekS(*stroka,-1,#PB_Unicode)
PokeS(*stroka,"999999999999999999999999999999999555555666666666666666655555555555555555555555555555",95,#PB_Unicode)
Debug PeekS(*stroka,-1,#PB_Unicode)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вс апр 28, 2019 8:46 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
Вот смотри какая фигня всплыла.
Пока строку не возвращаем(по сути она у нас глобальная и мы можем без возвращения использовать её) то память нормально чистится,как только ставлю procedurereturn всё утечка.
добавляется выделенной памяти в 2 раза больше а чистится на половину(как раз эта половина равно выделению без procedurereturn) :roll:
ps:по сути куда то зачемто дублируется строка :?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
Global stroka.s
Global mem.i=AllocateMemory(1)
Procedure freestroka()
  mem=ReAllocateMemory(mem,1)
  !mov dword eax,[v_mem]
  !mov dword [v_stroka],eax
EndProcedure
 
Procedure.s Spacce(kolihestvo.l)
 
 
  mem=ReAllocateMemory(mem,kolihestvo*2+2)
  !mov dword eax,[v_mem]
  !mov dword [v_stroka],eax
 
  Protected i.i
  For i=mem To mem+kolihestvo*2 Step 2
    PokeU(i,55)
  Next
  PokeW(i+2,0)
 ; ProcedureReturn stroka
 
EndProcedure
 
 
 
MessageRequester("пример 1","начало ")
 
Spacce(100000000)
 
 
 
 MessageRequester("пример 2","получили строку")
 
 freestroka()
 
 
 MessageRequester("пример 3","очистили строку")
 
 FreeMemory(mem)
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вс апр 28, 2019 11:27 pm 
Не в сети
ассистент

Зарегистрирован: Сб фев 02, 2019 9:46 pm
Сообщений: 13
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Сергейчик писал(а):
Global *stroka
Procedure test()

s.s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
*stroka=@s
Debug PeekS(*stroka,-1,#PB_Unicode)

EndProcedure
test()

Так это ты новую глобальную переменную объявил и записал в нее адрес памяти. Но от этого переменная s.s глобальной не стала и доступа к ней из вне нет. Даже если ты ее объявишь так Protected.s s, то получишь точно такой же результат, попробуй. То, что ты делаешь - просто передаешь указатель на память. Так же работают винапи с передачей указателя на строку.
Но если ты из процедуры уберешь PeekS, то результат уже будет другим, строка очистится:
Код:
1
2
3
4
5
6
7
8
Global *stroka
Procedure test()
   s.s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    *stroka=@s
EndProcedure
test()
Debug PeekS(*stroka,-1,#PB_Unicode)
 



Сергейчик писал(а):
как только ставлю procedurereturn всё утечка

Вот вот, потому что память не освобождается. Или можешь попробовать в этой процедуре записать в stroka данные из mem при помощи PeekS и память так же в два раза увеличится, правда потом ошибка будет при очистке памяти


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн апр 29, 2019 3:06 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
Вот фиг она чистится а похоже тупо 0(конец строки втыкается в начало и всё). :?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
Global stroka.s
Global mems.s
Global mem.i=AllocateMemory(1)
 
 
Procedure freestroka()
  mem=ReAllocateMemory(mem,1)
  !mov dword eax,[v_mem]
  !mov dword [v_stroka],eax
EndProcedure
 
Procedure.s Spacce(kolihestvo.l)
 
 
  mem=ReAllocateMemory(mem,kolihestvo*2+2)
  !mov dword eax,[v_mem]
  !mov dword [v_stroka],eax
 
  Protected i.i
  For i=mem To mem+kolihestvo*2 Step 2
    PokeU(i,55)
  Next
  PokeW(i+2,0)
 
 
 ; ProcedureReturn stroka
 
EndProcedure
Procedure.s Spacce1()
 
 ; mems=PeekS(mem,-1,#PB_Unicode)
  mems=stroka
 
 
  mems=""
 
 ; ProcedureReturn mems
 
EndProcedure
 
 
MessageRequester("пример 1","начало ")
 
Spacce(100000000)
 
 
 
 MessageRequester("пример 2","получили строку")
 
 
 Spacce1()
 
 freestroka()
 
 
 MessageRequester("пример 3","очистили строку")
 
 FreeMemory(mem)
 
For i=0 To 100 Step 2
   ;Debug PeekA(@mems+i)
Next
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн апр 29, 2019 6:57 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 283
Благодарил (а): 40 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Господа, боюсь вы оба путаете термины освобождается и очищается, при освобождении не происходит очистки, она может затереться новыми данными, а может остаться как есть (если не понадобилась).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Нашел! Нашел!
СообщениеДобавлено: Пн май 13, 2019 9:48 am 
Не в сети
ассистент

Зарегистрирован: Вт мар 06, 2018 7:45 am
Сообщений: 16
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
При помощи инструмента NoLeak.pbi из https://www.purebasic.fr/english/viewto ... NoLeak.pbi
Вставить в начало кода.
Запускать под отладчиком.
В нужный момент открыть Отладчик/Просмотр переменных и изучить список неосвобожденных блоков, фонтов, имиджей.
Обнаружил что создавал блок 2 байта, применял, но не освобождал. Поэтому память медленно росла.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
 
*Null=AllocateMemory(2)
PokeB(*Null, $05)
PokeB(*Null+1, $00)
Null_Size=MemorySize(*Null)
...
len_data=OID_Size+Null_Size
*len=BERenc_Length(OID_Size+Null_Size)
...
CopyMemory(*Null,*seq+1+lenSize+OID_Size,Null_Size)
 
 



Переосмыслил этот момент - зачем каждый раз создавать строго фиксированый блок?
И вставил готовый в DataSection.
Код:
1
2
3
4
5
6
7
8
9
10
11
 
DataSection
        BlockNull:
        Data.b $05, $00
EndDataSection
.....
.....
Null_Size=2 ;чтобы было понятней
.....
CopyMemory(?BlockNull,*seq+1+lenSize+OID_Size,Null_Size)
 



пока полет нормальный !!!
NoLeak.pbi рулез!!!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн май 13, 2019 10:26 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
Азачем вообще нужен этот блок *Null? :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн май 13, 2019 10:50 am 
Не в сети
ассистент

Зарегистрирован: Сб фев 02, 2019 9:46 pm
Сообщений: 13
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Kuzmat писал(а):
вы оба путаете термины освобождается и очищается

Не, не путаю. Из первой проблемы плавно перешли ко второй))

sadstar писал(а):
И вставил готовый в DataSection.

А можно сделать так
Код:
1
2
Null.w = $0005
;ShowMemoryViewer(@Null, 2)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вт май 14, 2019 1:17 am 
Не в сети
ассистент

Зарегистрирован: Вт мар 06, 2018 7:45 am
Сообщений: 16
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
Азачем вообще нужен этот блок *Null? :roll:

Таков формат SNMP-запроса.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Вт май 14, 2019 3:16 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 862
Благодарил (а): 2 раз.
Поблагодарили: 41 раз.
Пункты репутации: 9
Я о том что может константой можно.
А в запросе какое то есть постоянство,типа блоков с данными?. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн май 27, 2019 4:11 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1764
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
чото у меня с памятью фигня какая-то творится. значит предыстория - файл может быть как есть, а может быть запакован.

читаю его в память, проверяю не запакован ли. распаковываю если надо.

после парсинг, и запоминание где что лежит с их адресами.

после процедуры какие надо, и сохранение. если обычное сохранение, без увеличивания сегментов внутри файла - все замечательно. однако если мне надо увеличить на 3 сегмента, то в итоге 2 байта где-то теряю.

память сама на себя реалокейтится. что скорей всего не правильно, ну да фиг с ней:
Код:
1
*SaveMem = ReAllocateMemory(*SaveMem, savememsize)


вот она в три захода увеличивается. каждый раз одинаковый размер. в данном случае скажем 97 байт. и в итоге потом смотрю на файл - 2 байта корова слизала и все тут.

впрочем я что-то припоминаю про 2 байта символа конца файла или что-то такое... может это как раз тот случай? приписать +2 и дело с концом? так то срабатывает если файл надо увеличить, но если надо сохранить как есть - увеличивается на 2 лишних байта. видимо можно флаг повесить, типа был реалокейт, то +2 байта, не было - сохранять как есть.
Код:
1
WriteData(0, *SaveMem, savememsize+2)



но это какая-то порнография... плюс еще не проверял как себя поведет при уменьшении файла. пойду тестировать кстати.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн май 27, 2019 4:30 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1764
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
сранно сранно... реалокейт, добавляя память - затирает последний байт. разве реалокет не должно прибавлять после окончания оригинального кусочка памяти? чего оно налезает на один байт старой памяти? можно попробывать #PB_Memory_NoClear написать - я все равно потом дописываю в этот фрагмент свои нули, и тем не менее странная фигня это все.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечка памяти
СообщениеДобавлено: Пн май 27, 2019 6:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11491
Благодарил (а): 4 раз.
Поблагодарили: 468 раз.
SereZa писал(а):
реалокейт, добавляя память - затирает последний байт.
Не подтверждается.
Код:
1
2
3
4
5
6
7
8
*x = AllocateMemory(10)
For i=0 To 9
  PokeA(*x+i, i)
Next i
ShowMemoryViewer(*x, MemorySize(*x))
Delay(2000)
*x = ReAllocateMemory(*x, 20)
ShowMemoryViewer(*x, MemorySize(*x))


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB