![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |