(решено) SIGSEGV do arrBitmap[b].Free; - что не так?
Модератор: Модераторы
Всё может быть))
Придется всетаки разобраться, а не тупо хватать любую чушь
Придется всетаки разобраться, а не тупо хватать любую чушь
zub писал(а):Придется всетаки разобраться, а не тупо хватать любую чушь
Давайте разберёмся, вот полный код вместе с обработкой в середине.
Код: Выделить всё
private
arrBitmap : array[0..33] of TBitmap;
procedure TFormMain.FormCreate(Sender: TObject);
var
b:byte;
begin
for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;
procedure TFormMain.someName();
var
b:byte;
begin
for b := 0 to 22 do begin
// ......
Image1.Picture.Bitmap.LoadFromFile('xxx'+IntToStr(b)+'.png');
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);
end;
end;
procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
b:byte;
begin
try
finally
for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
end;
end;
Я не знаю LCL и не могу сказать приводит ли Assign к ссылкам внутри arrBitmap[] на одно и тоже. Думаю не должен.
Дальнейшие разбирательства с моим участием только при наличии минимального компилируемого примера с ошибкой.
Дальнейшие разбирательства с моим участием только при наличии минимального компилируемого примера с ошибкой.
Код: Выделить всё
arrBitmap : array[0..33] of TBitmap;Код: Выделить всё
arrBitmap : array of TBitmap;Упс... сам наплутал (решение верное но не в данном варианте).
я ошибся... Не ведитесь на бородатыхНо: Бородатый Пупсик - оказался прав!
во..во.Придется всетаки разобраться, а не тупо хватать любую чушь
Код: Выделить всё
FreeAndNil(arrBitmap[b]);или
Код: Выделить всё
(arrBitmap[b] as TBitmap).Free;п.с.
По идее, при закрытии формы массив удаляется.
Плюс: если вы хотите хранить что то в массиве то не надо так делать. Т.е. сами обрабатывайте запись в массив и удаление. А не наляписто
Код: Выделить всё
arrBitmap[b] := TBitmap.Create;Или воспользуйтесь модулем fgl - для хранения объектов (если не охота писать работу с массивом).
зачем вообще здесь нужен массив ???
>>а что тогда это?
Я имел ввиду что нет разницы статический или динамический - в этом случае у них одинаковое поведение, но чето не сложилось и "перередактировал" сообщение
Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вызов деструкторов
Я имел ввиду что нет разницы статический или динамический - в этом случае у них одинаковое поведение, но чето не сложилось и "перередактировал" сообщение
Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вызов деструкторов
zub писал(а):Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вы зов деструкторов
В общем я попробовал сделать пример, но в примере ошибка исчезла...
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, Grids;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
arrBitmap : array[0..33] of TBitmap;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
b:byte;
begin
for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b:byte;
aRect:TRect;
begin
aRect.Top := 0;
aRect.Left := 0;
aRect.Bottom := Height;
aRect.Right := Width;
for b := 0 to 22 do begin
Image1.Picture.LoadFromFile('1.png');
arrBitmap[b].Assign(Image1.Picture.Bitmap);
Canvas.StretchDraw(aRect,arrBitmap[b]);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
b:byte;
begin
try
finally
for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
end;
end;
end.
В вышеприведённом примере - ошибка не выскакивает.
Сбой - где-то в другом месте
Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
grot писал(а):зачем вообще здесь нужен массив ???
Массив хранит картинки, которые используются очень часто на протяжении работы программы.
.
>>но в примере ошибка исчезла...
к вопросу о пользе минимальных примеров, а не к обрывком какойто лабуды в стартовых постах
Добавлено спустя 5 минут 43 секунды:
>>Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
Остается например посмотреть на каком индексе вылет, или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?. Потом глянуть стек и таки узнать на освобождении чего вылет... А вот гадать ассигн это или не ассигн не остается...
к вопросу о пользе минимальных примеров, а не к обрывком какойто лабуды в стартовых постах
Добавлено спустя 5 минут 43 секунды:
>>Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
Остается например посмотреть на каком индексе вылет, или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?. Потом глянуть стек и таки узнать на освобождении чего вылет... А вот гадать ассигн это или не ассигн не остается...
zub писал(а):о пользе минимальных примеров
ну... ошибка-то, где то, здесь прячется...
pupsik писал(а):FreeAndNil(arrBitmap[b]);
Вот так, точно, перестала выскакивать: for b := 8 downto 0 do FreeAndNil(arrBitmap[b]); Проверил несколько раз.
Последний раз редактировалось vitaly_l 25.01.2017 12:17:34, всего редактировалось 1 раз.
zub интересует: насколько правильный данный код...
И можно ли его по другому написать?
Добавлено спустя 2 минуты 45 секунд:
И можно ли его по другому написать?
Добавлено спустя 2 минуты 45 секунд:
по идее: дело в другом.Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free;
- Вложения
-
- im_col.7z
- (59.24 КБ) 661 скачивание
Я не специалист по правильным кодам. вылетов вроде нет, утечек вроде нет - потянет. Но имхо для классов генерики никаких плюсов не несут
Добавлено спустя 1 минуту 2 секунды:
>>дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Дают, но после того как ты устранишь ошибки
Добавлено спустя 1 минуту 2 секунды:
>>дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Дают, но после того как ты устранишь ошибки
а я по иной причине спросил. Вы же, если не ошибаюсь, с ними плотно работаете.Я не специалист по правильным кодам.
в принципе да.Но имхо для классов генерики никаких плюсов не несут
п.с.
Код не несет полезности, тем более пара строчек. Просто стало интересно...
pupsik писал(а): im_col.7z
Так как в примере, более правильно создавать массивы картинок? Не понимаю, почему?
zub писал(а):Дают, но после того как ты устранишь ошибки
Нет никаких ошибок, всё работает.
zub писал(а):посмотреть на каком индексе вылет,
или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?.
Потом глянуть стек и таки узнать на освобождении чего вылет...
Вот на эти действия можно получить инструкцию? ( только, пожалуйста, без отправки в гууугл, я не хочу стоять в гуу-углу )
/
Что значит плотно? Обычно. использую в виде велосипедов и в виде fpc-stl.
Но имхо для классов генерики никаких плюсов не несут
Статическая проверка типа значения, присваиваемого элементу коллекции
