purebasic.info

PureBasic forum
Текущее время: Пн май 20, 2019 3:48 am

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




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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 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
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Kuzmat писал(а):
память не течет

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

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

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 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
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 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
Сообщений: 12
Благодарил (а): 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
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 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
Сообщений: 15
Благодарил (а): 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
Сообщений: 827
Благодарил (а): 2 раз.
Поблагодарили: 38 раз.
Пункты репутации: 9
Азачем вообще нужен этот блок *Null? :roll:


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

Зарегистрирован: Сб фев 02, 2019 9:46 pm
Сообщений: 12
Благодарил (а): 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
Сообщений: 15
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Сергейчик писал(а):
Азачем вообще нужен этот блок *Null? :roll:

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


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

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


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

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


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

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


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

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