Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c