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