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

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

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

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

Сообщение BadBoyAlex » 22.05.2015 17:40:14

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

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

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

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

Сообщение kazalex » 22.05.2015 18:25:15

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. Типизированному указателю присваивается ссылка на данные локальной переменной.
Что происходит дальше? После завершения процедуры компилятор освобождает локальные переменные управляемых типов, т.е. локальная строка будет удалена, а вызывающая сторона получит ссылку на данные, которых больше нет.

И вообще, с шарингом строк между основным процессом и загружаемыми библиотеками могут возникнуть и другие ошибки, если нет полного понимания механизмов работы.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение BadBoyAlex » 22.05.2015 18:29:35

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

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

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

Сообщение kazalex » 22.05.2015 18:38:38

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

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

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 219

Рейтинг@Mail.ru