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
ты сам то понимаешь смысл написанного, потому что я -- нет