Главная страница
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.013 c
14-52408
Dimman1
2003-11-17 20:23
2003.12.16
Какой выбрать монитор


1-52257
Maxio
2003-12-04 11:11
2003.12.16
Нажать ENTER


1-52155
Andrey V.
2003-12-03 12:41
2003.12.16
Окно поверх всех


3-52121
Andrey V.
2003-11-25 13:52
2003.12.16
Отменть запрос во время его выполнения.


1-52236
PredatoR_777
2003-12-04 21:56
2003.12.16
Button