Показать сообщение отдельно
  #22  
Старый 14.03.2013, 18:03
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Но мне почему-то видится так:
Код:
Temp := Pointer(Dest); // сохраняем Dest в Temp
if CharLength > 0 then // если требуемая длина ненулевая(мой вариант идём в begin end)
 begin
    Pointer(Dest) := _NewUnicodeString(CharLength); // создаём новую! строку
     if Source <> nil then // если надо чем-то заполнить новую строку(мне не надо, след строку не выполняем)
      Move(Source^, Pointer(Dest)^, CharLength * SizeOf(WideChar)); // заполняем строку содержимым. С моими параметрами вызова это не происходит, но и происходило бы - ради бога
   end
  else // сюда вообще не попадаем, у меня длина строки больше нуля, но всё же
    Pointer(Dest) := nil; // раз строка пустая, то вот вам нильсен
_UStrClr(Temp);  // нас это не колышет, результат-то у нас в Dest, тем не менее обнулили старую строку.
И вот почему же я должен предварительно обнулять Dest, если его всё равно выкидывают на помойку и с нуля создают новую строку? И откуда в конце концов вылазит Access Violation?
Если посмотреть ассемблерный код после {$ELSE}, то там то же самое.

Всё!!! Всем спасибо, я допёр.
А "выполняет пункты 1)-5) из моего первого поста. На шаге 4) и происходит облом" - она не с результатом их выполняет и в самом конце, т.е. говорили мы в нужную сторону.
Резюме: SetString() выделяет под строку новую память, но про старую строку не забывает, уменьшает у ней refCnt. Так и должно быть.
На один вопрос я ответ не получил, но это чистое любопытство и крайне несущественно. Тема закрыта. Ещё раз пасибки!
Ответить с цитированием