delphi - Переполнение стэка при инициализации класса


0
type TGBrush = class
private
    const   MaxBrushes            = 1000;

    var     imginf                :imageInfo;
            brushList             :tstringlist;
            setedBrush            :TImage;
            BeginCoords           :Tpoint;
            NowPainting           :boolean;

public

procedure   setBrush(BNumber:integer;color:tbgra);
procedure   paintBrush(x, y:integer);
procedure   BrushTo(x,y:integer);
procedure   EndPaint;
constructor   Create(Image: ImageInfo);

end;

    ////////////////////////////////////////////////////////////
var  b:tgbrush;
begin
b:=tgbrush.Create(can.imgInf);   //Stack overflow
end;

Что я делаю не так??

          constructor TGBrush.create(Image: ImageInfo);
          var sl:TSearchRec; i:integer;
          begin
           // здесь всё закоментированно
          end;
      ////////////////////////////////////////////////////////////   
       type   Tbgra = record
       b,g,r,a:byte;
       end;

       type   bgraArray = array [1..imgmaxwh] of Tbgra;
       Pbgra1dArray=^bgraArray;

       type   Bgra2dArray = array [1..imgmaxworh] of array [1..imgmaxworh] of ^tbgra;

         type   ImageInfo = record
         width, height          :integer;
         bufDC                  :hdc;
         srcHDC                 :hwnd;
         pixels1d               :Pbgra1darray;
         pixels2d               :Bgra2darray;
         end;
Источник
  •  206
  •  1
  • 31 янв 2012 2012-01-31 14:50:05
приведите код класса ImageInfo, можно еще и класса переменной can, похоже ошибка где-то в них — 31 янв 20122012-01-31 14:24:41.000000
Я imginf заменил на простую переменную такого же типа, всё-равно ошибка остаётся. — 31 янв 20122012-01-31 14:11:21.000000
если imgInf у объекта can - это свойство (property), а не член класса, то не может происходить переполнение стека в его коде? — 31 янв 20122012-01-31 14:08:19.000000
Пробовал в конструторе убрать раздел var - но ошибка остаётся — 31 янв 20122012-01-31 13:59:59.000000
приведите код конструктора Create(Image: ImageInfo) — 31 янв 20122012-01-31 13:56:51.000000

1 ответ

0

Кажется я понял. Я передаю в качестве параметра в записи ImageInfo массив на 3000х3000 (imgMaxWH=9000000) элементов - Bgra2dArray. А стека на такой массив не хватает. Нужно только передать на него указатель.

похоже что так, т.к. переменные класса record помоему всегда храняться в стеке, и стек может быстро переполниться если вы создадите много таких записей — 31 янв 20122012-01-31 14:31:41.000000