![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели
Del © (2009-08-13 19:30:00)Конец рабочего дня...
Вопросик:
procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
J: Integer;
IntArr: ^TIntegerDynArray;
begin
New(IntArr);
SetLength(IntArr^, 5);
for J := 0 to 5 - 1 do
IntArr^[J] := J;
P := IntArr^;
for J := 0 to Length(TIntegerDynArray(P)) - 1 do
Memo7.Lines.Add(IntToStr(TIntegerDynArray(P)[J]));
SetLength(TIntegerDynArray(P), 0);
----------Здесь P = nil и в итоге указатель сам не уничтожается методом
---------- Dispose(P) в итоге засоряю пармять... как лечить???
Dispose(P);
end;
Palladin (2009-08-13 20:09:00) [21]
> [12] Anatoly Podgoretsky © (13.08.09 20:08)
У него указатель на дин массив, а не сам дин массив
Anatoly Podgoretsky (2009-08-13 20:08:00) [22]
Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.
Кроме того разименование для динамических массивов свихнет крышу любому компилятору.
Del (2009-08-13 20:05:00) [23]Код очень маленьки... специально выложил, чтоб можно было скопипастить... запустить... и понять... в чем дело.
Все работает... ток вот FastMM грит что:
---------------------------
Project4.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):
1 - 4 bytes: Unknown x 1
21 - 28 bytes: Unknown x 1
Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".
---------------------------
OK
---------------------------
Вот это то и напрягает
Palladin (2009-08-13 20:04:00) [24]и все таки, ты можешь расскрыть тайну необходимости именно указателя?
Del (2009-08-13 20:02:00) [25]Ругается в момент dispose(P)
Del (2009-08-13 20:01:00) [26]После проставления крышечек...
Компилятор вежливо ругнулся:
---------------------------
Debugger Exception Notification
---------------------------
Project Project4.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.
---------------------------
Break Continue Help
---------------------------
Palladin (2009-08-13 19:58:00) [27]
> for J := 0 to Length(TIntegerDynArray(P)) - 1 do
> Memo7.Lines.Add(IntToStr(TIntegerDynArray(P)[J]));
а это что за несусветство? где крышки емае??
Palladin (2009-08-13 19:57:00) [28]без запятой... это апичатка
Palladin (2009-08-13 19:57:00) [29]"вот понадобилось" это не причина
куда ты ее добавляешь?
SetLength(TIntegerDynArray(P, ^), 0);
Dispose(P);
Del (2009-08-13 19:55:00) [30]Вот понадобилось...
Реализовываю метод принимающий в параметрах массив массивов неопределенных типов.
Ну вот... если срубаю SetLength Dispose выдает ошибку... если добавляю крышку... тоже
Palladin (2009-08-13 19:49:00) [31]и SetLength(0) ему в конце делать не обязательно, об этом позаботится компилятор, все это написано в справке по динамическим массивам
Palladin (2009-08-13 19:48:00) [32]
> SetLength(TIntegerDynArray(P), 0);
если уж и приводишь тип, так будь добр после идентификатора поставить крышечку...
и повторюсь, дин массив уже указатель
Palladin (2009-08-13 19:47:00) [33]нахрена тебе указатель на указатель?