Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-52268
Kott
2003-11-26 22:31
2003.12.16
RX Library


7-52424
Calm
2003-10-10 16:21
2003.12.16
Сколько раз возникнет событие TServerSocket.ClientRead?


1-52244
Не знающий
2003-12-04 14:19
2003.12.16
Как скопировать файл?


1-52277
Michail Fedorov
2003-12-03 13:06
2003.12.16
Список шрифтов в Combobox


1-52202
DVP777
2003-12-05 11:24
2003.12.16
Автоповтор в проигрывания в MediaPlayer? - ну, забыл ей-богу!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский