AlekXL
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору xpin2013 Цитата: Любые Ваши доводы, что я не прав будут комментироваться следующим кодом: Цитата: Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF}); | и что? хелпер копирует содержимое, а приведение в изначальном примере копирует указатель. Цитата: Опрос на тему кто ошибается закрыт. | ты ошибаешься, и это не признак ума, когда ошибки свои не хочешь признавать .. Цитата: >Delphi2010 (SysUtils.pas) >TBytes = array of Byte; В Delphi2010 все функции выделения памяти, счётчики изменения размеров совместимы со строками. >Delphi XE7 >TBytes = TArray<Byte>; | а TArray<T> = array of T; таким образом, TBytes =array of Byte; то же самое, что и в 2010 Цитата: Всё то же, только сделана неумелая попытка финализации переменной типа AnsiString с помощью функции _DynArrayClear. Это нормально что в функцию _DynArrayClear попадает адрес строки? Нет | не так. Это в функцию LStrClr попадает адрес дин. массива. Ты же строке Current впердолил указатель на динамический массив: вот , в эпилоге, LStrClr и освобождает память для блока, который считает строкой, но который строкой не является. Разница между D2010 и XE7 может быть только в порядке финализации объектов. То есть XE7 вызывает сначала DynArrayClear для безымянного массива, который ты вытащил выражением FDTable1.Bookmark, а потом уже LStrClr . В Delphi 2010 могло быть иначе: сначала финализируется, наверное,строка Current(но , поскольку счетчик не будет нулевым вследствие ссылки от безымянной переменной-массива, то освобождения памяти там не происходит). А потом финализируется безымянная посредством DynArrayClear . Разница в том, что в случае с LStrClr в FreeMem передается указатель (p-sizeof(TStrRec)), а в DynArrayClear -- указатель (p-sizeof(DynArrayRec)). Они не одинаковые. Доходит? Цитата: Ошибок не возникает, правда - цена вопроса уже 1 буква - это цифра 2 | ты сам то понимаешь смысл написанного, потому что я -- нет |