Непонятный краш приложения в Win32

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

kazalex писал(а):
BadBoyAlex писал(а):Что не так?

Ссылка на Str, которая живет только в рамках MyFmtStr.

А зачем ей жить ещё где-то?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

BadBoyAlex писал(а):А зачем ей жить ещё где-то?

Для понимания, давай по шагам:

Код: Выделить всё

procedure MyFmtStr (var VStr: PChar);
var Str: String;
begin
Str:= VStr;
Str:= Format(Str, [1,2,3]);
VStr:= PChar(Str);
end;

1. Локальной переменной Str присваивается значение. Для этого, компилятор создает новую строку и копирует в неё данные из типизированного указателя.
2. Строка пересоздается.
3. Типизированному указателю присваивается ссылка на данные локальной переменной.
Что происходит дальше? После завершения процедуры компилятор освобождает локальные переменные управляемых типов, т.е. локальная строка будет удалена, а вызывающая сторона получит ссылку на данные, которых больше нет.

И вообще, с шарингом строк между основным процессом и загружаемыми библиотеками могут возникнуть и другие ошибки, если нет полного понимания механизмов работы.
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

kazalex писал(а):Типизированному указателю присваивается ссылка на данные локальной переменной.

А как передать данные?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

BadBoyAlex писал(а):А как передать данные?

С такой декларацией, только определением размера буфера (PChar это всегда указатель на данные заканчивающиеся нулевым байтом) и работой именно с этим буфером. Если работать будет только на виндах, можно использовать WideString и забыть об указателях.
Ответить