Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Указатели


Страницы:   1 2

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]

нахрена тебе указатель на указатель?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо