Форум: "Начинающим";
Текущий архив: 2015.01.11;
Скачать: [xml.tar.bz2];
ВнизРабота с указателями вопросы Найти похожие ветки
← →
вова (2013-12-17 01:35) [0]есть функция
GetMassive(var InPTStart, InPTStop: pWord): boolean;
var
sumBufX: TSimpleSearchArray;
fSizeUS : integer;
begin
.....................................
InPTStart := @sumBufX[0];
InPTStop := @sumBufX[fSizeUS];
result := true;
end;
вопрос: что будет когда эта функция выполнится? В вызывающей функции из которой были переданы InPTStart,InPTStop они будут указывать на массив? или массив уничтожится при выходе из этой функции и указатели будут указывать хз куда? А если массив все еще будет существовать, то как его потом очистить? Указателям вызывающей функции присвоить nil? или при завершении вызывающей функции указатели итак обнулятся? И что если вызывающая функция передает эти полученные указатели в конструктор класса(уже без var), в котором они присваиваются переменным этого класса, когда вызывающая функция закончится единственные указатели на массив будут в переменных класса? и когда класс будет уничтожен массив также будет уничтожен?
← →
RWolf © (2013-12-17 02:47) [1]Память, выделенная под sumBufX, автоматически освобождается при возврате из функции, после этого указатели недействительны.
← →
Ega23 © (2013-12-17 08:39) [2]
> или массив уничтожится при выходе из этой функции и указатели
> будут указывать хз куда?
Память будет считаться свободной. Указатели будут смотреть туда, где был этот массив. Если не повезёт, то память не успеет затереться и таки ты потом получишь валидные данные и адский геморрой по ловле такого бага.
> или при завершении вызывающей функции указатели итак обнулятся?
В Delphi само ничего никогда не обнуляется. Исключение - счётчики ссылок, но тебе про это, похоже, ещё рановато...
> И что если вызывающая функция передает эти полученные указатели
> в конструктор класса(уже без var), в котором они присваиваются
> переменным этого класса, когда вызывающая функция закончится
> единственные указатели на массив будут в переменных класса?
> и когда класс будет уничтожен массив также будет уничтожен?
Ничего не будет. Указатель - это просто указатель на некий адрес. Что по этому адресу сидит - это не его забота. Если аналогию провести, то у тебя есть квартира, ты адрес этой квартиры диктуешь товарищу (передаёи полученные указатели), тот записывает их в свой блокнот (в котором они присваиваются переменным этого класс), а потом блокнот рвёт (и когда класс будет уничтожен). Квартира-то не взорвалась, верно?
← →
Вова (2013-12-17 10:40) [3]
> В Delphi само ничего никогда не обнуляется. Исключение -
> счётчики ссылок, но тебе про это, похоже, ещё рановато.
> ..
массив же сам обнуляется (
Получается что нужно создавать 2 массива. 1й в вызывающей функции, затем передавать его в заполняющую функцию.GetMassive(var sumBufX: TSimpleSearchArray): boolean;
var
fSizeUS : integer;
begin
.....................................
result := true;
end;
А вызывающая функция создает объект класса для которого собственно этот массив и создавался и т.е. когда я передам в конструктор этот массив, там мне его нужно будет опять копировать во второй массив, т.к. первый массив уничтожится после того как вызывающая функция отработает, а объект класса останется. Не торт. Хочу 1 массив и просто передать на него указатель (
← →
DVM © (2013-12-17 10:46) [4]
> Получается что нужно создавать 2 массива. 1й в вызывающей
> функции, затем передавать его в заполняющую функцию.
Зачем 2? Во внешнем коде создавай один и по ссылке передавай его в функцию.
Вообще это хороший тон, создавать(выделять память) и уничтожать(освобожать память) в одном и том же месте.
← →
Вова (2013-12-17 10:50) [5]InPTStart : ^TSimpleSearchArray;
New(InPTStart);
Dispose(InPTStart);
?
Вообще я где то читал, что память зарезервирована пока на нее указывает хоть 1 указатель (ну то есть она не будет отдана кому то другому), только не помню к чему это относилось.
← →
Вова (2013-12-17 10:54) [6]
> Зачем 2? Во внешнем коде создавай один и по ссылке передавай
> его в функцию.Вообще это хороший тон, создавать(выделять
> память) и уничтожать(освобожать память) в одном и том же
> месте.
Это я и написал, но этот массив я делаю, чтобы передать его в создаваемый класс. И второй получается нужен в классе, потому что вызывающая функция (в которой массив будет локальной переменной) прекратит работу, а объект класса который она создала останется.
← →
Inovet © (2013-12-17 10:57) [7]> [5] Вова (17.12.13 10:50)
> что память зарезервирована пока на нее указывает хоть 1
> указатель (ну то есть она не будет отдана кому то другому)
Это ты не про Делфи читал, а про то, где есть сборщик мусора.
← →
Вова (2013-12-17 10:58) [8]
> InPTStart : ^TSimpleSearchArray;New(InPTStart);Dispose(InPTStart);
ток вот, где то тут задание размера массива.....т.е. динамический массив не получается.....
← →
Вова (2013-12-17 11:01) [9]
> Это я и написал, но этот массив я делаю, чтобы передать
> его в создаваемый класс. И второй получается нужен в классе,
> потому что вызывающая функция (в которой массив будет локальной
> переменной) прекратит работу, а объект класса который она
> создала останется.
И да, объектов классов может быть несколько, и в каждом из них свой массив с разным содержимым, т.е. глобальный массив тоже не катит.
← →
DVM © (2013-12-17 11:05) [10]
> Вова (17.12.13 11:01) [9]
> И да, объектов классов может быть несколько, и в каждом
> из них свой массив с разным содержимым, т.е. глобальный
> массив тоже не катит.
Почему бы тогда массив не сделать полем класса и управление памятью массива не возложить на класс. А в твои функции и передавай это поле или даже весь экземпляр класса целиком.
← →
Вова (2013-12-17 11:05) [11]ну ладно, похоже придется делать то, что я как раз и не хотел делать ) создавать массив внутри класса, вызывая методы другого класса в котором данные для массива и содержатся (
← →
MBo © (2013-12-17 11:06) [12]А что такое TSimpleSearchArray ?
← →
Вова (2013-12-17 11:16) [13]array of word;
← →
MBo © (2013-12-17 11:24) [14]тогда возня с указателями на массив и new/dispose совсем не нужна
← →
Ega23 © (2013-12-17 12:58) [15]
> ну ладно, похоже придется делать то, что я как раз и не
> хотел делать ) создавать массив внутри класса, вызывая методы
> другого класса в котором данные для массива и содержатся
> (
Нормальная практика, не вижу никаких проблем.
← →
Sapersky (2013-12-17 19:29) [16]Вообще я где то читал, что память зарезервирована пока на нее указывает хоть 1 указатель (ну то есть она не будет отдана кому то другому), только не помню к чему это относилось.
Применительно к дин. массивам (строкам, интерфейсам, вариантам) - да.
Но только при копировании переменных одного типа присвоением, т.е.
Var a,b : TSimpleSearchArray;
b:=a; // если уничтожить a, массив всё равно будет жить (под именем b)
Var a : TSimpleSearchArray;
b : Pointer;
b:=@a[0]; // а так не будет
Ну и тебе уже говорили, наверное, что если подразумевается постоянная работа этого дела, да ещё и в реальном времени, то лучше выделять память заранее (включая создание объектов, битмапов и т.д.), а "на лету" создавать/уничтожать как можно меньше.
← →
Вова (2013-12-17 23:58) [17]ну я поэксперементировал на тему создания на "лету", и массив 1920 на 1080 создается и уничтожается за 0.156 миллисекунды. Учитывая что самая быстрая обработка этого массива у меня занимает в районе 3 миллисекунд, то вроде бы вполне приемлемо на лету создавать массивы, т.к. разница не ощутима. А вот если например забабахать массив 19200 н 1080 тогда уже и скорость создания и освобождения будет раз в 10 медленнее, но таких массивов у меня нет. Поэтому я пока решил что лучше сэкономить на занимаемой памяти, чем на скорости.
← →
DVM © (2013-12-18 00:04) [18]
> то вроде бы вполне приемлемо на лету создавать массивы,
> т.к. разница не ощутима.
Если постоянно выделять-освобождать большие блоки данных через некоторое время можем получить Out of Memory на ровном месте из за фрагментации памяти. Критично для программ 24*7.
← →
вова (2013-12-18 00:14) [19]а битмап у меня остался только 1 и он существует постоянно. Если таки переделаю деланье скриншота через DirectX то ни одного битмапа не будет.
врочем в данном случае речь о создании на лету не идет (т.е. этот массив создается только раз за все время работы программы), просто ссылки на второй класс не хотел плодить, т.к. есть идея от него избавится в будущем, если ссылки на его методы будут натыканы по всей программе, то это будет сложнее сделать.
← →
Ega23 © (2013-12-18 12:12) [20]А какая задача-то решается?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.01.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.002 c