Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.16;
Скачать: CL | DM;

Вниз

GetMem, потеря указателя   Найти похожие ветки 

 
sprit ©   (2003-12-02 23:58) [0]

Выделяю память для записи(record) GetMem. а потом обрашаюсь к ней по ссылке, после рассчетов с полями данной записи указатель на нее оказывается битым. Вопрос реально чтобы записи перемешались по памяти?
И при удлинее массива способом SetLenght начало массива в памяти перемещается?
Заранее благодарен.


 
Юрий Зотов ©   (2003-12-03 00:36) [1]

> реально чтобы записи перемешались по памяти?

Если Вы "вручную" не меняете указатели на них, то нереально. Если же меняете... то может быть что угодно.

> при удлинее массива способом SetLenght начало массива в
> памяти перемещается

Может, потому что память при этом перераспределяется.


 
Юрий Федоров ©   (2003-12-03 00:41) [2]

В рекорде присутствуют динамические массивы ?


 
sprit ©   (2003-12-03 08:04) [3]

В рекорде динамических массивов нет.
Указатель на память вручную я не меняю
Приведу кусок кода где происходит потеря указателя
есть 2 указателя на одну память

....
//A - это приведнноый указатель на рекорд
//A3DPoints[0] такой же указатель того же типа
lstPolys[0]^.A:=A3DPoints[0];
....
procedure (_matr: TMatrix;_lst:ArPF3DPoint);
var
I: integer;
depth: single;
_x,_y,_z: single;
begin
...
for i:=0 to high(_lst) do
with _lst[i]^ do
begin
with vid do
begin
_x:=x*_matr[0,0]+y*_matr[0,1]+z*_matr[0,2];
_y:=x*_matr[1,0]+y*_matr[1,1]+z*_matr[1,2];
_z:=x*_matr[2,0]+y*_matr[2,1]+z*_matr[2,2];
x:=_x;
y:=_y;
z:=_z;
// здесь еще (lstPolys[0]^.A=A3DPoints[0])=True
end; // после выода (lstPolys[0]^.A=A3DPoints[0])=False
if (_z = 0) then depth := 1
else depth := DISTANCE / (_z + DISTANCE);

Прогонял сотню раз не знаю в чем дело, причем остальные указатели остаются на месте;


 
Digitman ©   (2003-12-03 08:14) [4]

for i:=0 to high(_lst) - 1 do


 
Digitman ©   (2003-12-03 08:16) [5]

впрочем, не уверен ..

как объявлен _lst ?


 
sprit ©   (2003-12-03 12:36) [6]

>for i:=0 to high(_lst) - 1 do
потеря указателя происходит иненно тогда, когда i=high(_lst) но 1) тогда как обрабатывать последний элемент массива...
2) почему это возникает? high просто возврашает максимальный индекс массива...


P3DPoint = ^T3DPoint;
T3DPoint=record
x, y, z: float;
end;

PF3DPoint = ^TF3DPoint;
TF3DPoint =record
scr: TPoint;
vid: T3DPoint;
world: T3DPoint;
end;

ArPF3DPoint = array of PF3DPoint;


>В рекорде присутствуют динамические массивы ?
Разве от этого зависит что-либо, если я не ошибаюсь то в рекорде просто прописывается ссылка на динамический массив, но не он сам.


 
Reindeer Moss Eater ©   (2003-12-03 12:47) [7]

Скорее всего при работе с памятью расположенной по этому указателю теряется не указатель на распределенный блок, а затирается память за границами блока.

Например портится стек.


 
sprit ©   (2003-12-03 13:07) [8]

> Скорее всего при работе с памятью расположенной по этому
> указателю теряется не указатель на распределенный блок, а
> затирается память за границами блока.
Можно по подробнее, в частности как это влияет на данные, они то не изменяются.

Еще один вопрос, если не ошибаюсь GetMem выделяет память в куче? , тогда как порча стека может приводить к таким проблемам


 
Reindeer Moss Eater ©   (2003-12-03 13:10) [9]

GetMem выделяет в куче.
Но программеру никто не мешает ошибится в коде и затереть память не ту, что выделили.

Кроме того я не сказал, что портится стек, я сказал "например портится стек"


 
Reindeer Moss Eater ©   (2003-12-03 13:14) [10]

тогда как порча стека может приводить к таким проблемам

Например в процедуре объявлена локальная переменная.
var MyControl : TSomeControl;

Переменная эта живет в стеке. Портим стек - и ссылка на TSomeControl становится инвалидной


 
sprit ©   (2003-12-03 14:13) [11]

> Reindeer Moss Eater

Полность согласен, но у меня для данного массива локальные переменные не используются.

Со стеком все понятно, как понять "затирается память за границами блока", т.е. она обнуляется а блок отается не тронутым?


 
Reindeer Moss Eater ©   (2003-12-03 14:17) [12]

Да как угодно понять.
У тебя после работы с памятью возникает AV.
Вот из этого и надо исходить, и верить в возможность порчи памяти больше, чем в невозможность этого.


 
sprit ©   (2003-12-03 14:20) [13]

AV?


 
sprit ©   (2003-12-03 14:31) [14]

Извените стормозил (AV - AcessViolation)


 
sprit ©   (2003-12-04 00:44) [15]

Но все таки не понятно из-за чего это возникло и как еэто исправить, да и это происходит только если z присваиваешь новое занчение



Страницы: 1 вся ветка

Текущий архив: 2003.12.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-52146
RustiK
2003-12-05 13:45
2003.12.16
Сортировка чисел


9-52050
R2D2
2003-04-14 18:01
2003.12.16
TBASS 1.8 - последний релиз - как его устанавливать... ни единой


1-52246
stepan_mk
2003-12-04 12:55
2003.12.16
Приложение с className=TAppBuilder


3-52122
velial
2003-11-25 14:28
2003.12.16
TQuery.Refresh


1-52185
Dmitriy
2003-12-02 16:29
2003.12.16
Обработка мышиного колеса