![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте господа, вот назрел вопрос об освобождении памяти занятой типом String.
Код:
type PMyInfo = ^TMyInfo; TMyInfo = record a:pointer; s:integer; b:PMyInfo; end; var MyInfo:PMyInfo; procedure qwerty; var MyStr:PString; begin new(MyStr); {*} MyStr^:='qwerty'; {**} new(MyInfo); MyInfo.a:=MyStr; MyInfo.s:=sizeof(MyStr); end; begin {...некоторый код...} qwerty; freemem(MyInfo.a,MyInfo.s); dispose(MyInfo); end. в данном примере память выделяется 1) при создании указателя на строку(*) 2) при присвоении строке значения (**) освобождая командой freemem память мы освобождаем указатель на строку, но судя по переменной AllocMemcount - память занятая самой строкой не освобождается, в следствии чего возникают утечки. В общем случае нам неизвестен тип данных хранимых в переменной a. Известен размер для корректного освобождения памяти. Как корректно освободить память занятую string'ом??? |
#2
|
||||
|
||||
![]() Что должна делать строка
Код:
MyInfo.s:=sizeof(MyStr); |
#3
|
|||
|
|||
![]() да даже если поставить
Код:
MyInfo.s:=sizeof(MyStr^); |
#4
|
||||
|
||||
![]() Ну ведь просил подумать прежде чем отвечать. Длина строки проверяется функцией Length, а здесь Sizeof(MyStr) (в 32-битной ОС) всегда 4.
|
#5
|
|||
|
|||
![]() Цитата:
так как же освобождать память? пример в студию плиз... |
#6
|
||||
|
||||
![]() Цитата:
![]() |
#7
|
||||
|
||||
![]() Эх Pilot, торопишься, не даёшь человеку подумать.
![]() |
#8
|
|||
|
|||
![]() Цитата:
|
#9
|
||||
|
||||
![]() Цитата:
![]() |
#10
|
||||
|
||||
![]() Тяжело отвечать не понимая что делается, да и маленький нюанс - начиная с XP, операционка по завершению программы всё почистит.
|
#11
|
||||
|
||||
![]() Может стоит отойти от канонов Дельфи 3 и перейти к более высоким версиям, тогда
Код:
var MyInfo:PMyInfo; Код:
var MyInfo : array of TMyInfo; |
#12
|
||||
|
||||
![]() Код:
procedure qwerty; var MyStr:String; begin MyStr:='qwerty'; {**} new(MyInfo); MyInfo.a:=@MyStr; MyInfo.s:=length(MyStr); end; {...некоторый код...} qwerty; //freemem(MyInfo.a,MyInfo.s); dispose(MyInfo); |
#13
|
||||
|
||||
![]() или так:
Код:
procedure qwerty; var MyStr : String; begin Count := 1; // для примера MyStr := 'qwerty'; {**} SetLength(MyInfo, Count); MyInfo[Count - 1].a := @MyStr; MyInfo[Count - 1].s := Length(MyStr); end; {...некоторый код...} qwerty; |
#14
|
|||
|
|||
![]() а чем такой вариант плох?
Код:
x:='qwertyqqqqq.'; x_len:=length(x); GetMem(MyStr,x_len); MyStr^:=x; new(MyInfo); MyInfo.a:=MyStr; MyInfo.s:=x_len; ну и освобождение памяти как описано выше... в любом случае, всем спасибо... |
#15
|
||||
|
||||
![]() Цитата:
|