![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Цитата:
Код:
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); MyInfo.s := Length(MyStr); end; /* а теперь всё в обратном порядке */ procedure disposeMyInfo(aMyInfo:PMyInfo); var MyStr:PString; begin MyStr := PString(aMyInfo.a); MyStr^:=''; dispose(MyStr); // если выделяем через New, то и удаляем через dispose; dispose(aMyInfo); end; begin {...некоторый код...} qwerty; {...некоторый код...} disposeMyInfo(MyInfo); end. |
#8
|
|||
|
|||
![]() Цитата:
Код:
type PMyInfo = ^TMyInfo; TMyInfo = record Str:PChar; Len:integer; Next:PMyInfo; end; var MyInfo:PMyInfo = nil; function GenInfo(Str:String):PMyInfo; begin new(Result); Result.Next:=Nil; Result.Len:=Length(Str); GetMem(Result.Str,Length(Str)); {*} Move(Str[1],Result.Str^,Length(Str)); end; procedure DisposeMyInfo(aMyInfo:PMyInfo); begin FreeMem(aMyInfo.Str); dispose(aMyInfo); end; begin {...некоторый код...} MyInfo := GenInfo('qwerty'); {...некоторый код...} dispose(MyInfo); end. |