Waldek Hebisch wrote:
Peter N Lewis wrote:
Does New as a function return nil or does it still give a runtime error?
If I want to allocate memory, but handle it gracefully if it fails, what are the recommended approaches?
The modern way is to raise an exception. Unfortunatly, GPC still do not support exceptions (I have started working on this, but my code ATM is non-working).
Lacking exceptions you can just jump out of memory allocator (if you provide your own) or error handler (IIRC GPC allows you to install custom error handler).
You could also trap runtime errors, using `AtExit', or use the `Trap' unit (which does this internally). This comes somewhat closer to exception, though it's not quite the same. Indeed, this may be the best solution available. It's a bit code to write, but it uses `New' and has no disadvantages in this regard. program Trap2Demo; uses Trap; type p = ^t; t = record Next: p; Data: array [1 .. 50000000] of Integer end; function SafeAllocate = Res: p; procedure TryAllocate (Trapped: Boolean); begin if Trapped then begin TrappedExitCode := 0; TrappedErrorAddr := nil; Res := nil end else New (Res) end; begin TrapExec (TryAllocate) end; var i: Integer; v, w: p; begin w := nil; for i := 1 to 5 do begin if i > 1 then WriteLn ('Starting again'); repeat v := SafeAllocate; if v <> nil then begin WriteLn ('Allocated v at address ', PtrCard (v)); v^.Next := w; w := v end until v = nil; WriteLn ('Error occurred, continuing'); while w <> nil do begin v := w; w := w^.Next; WriteLn ('Disposing v at address ', PtrCard (v)); Dispose (v) end end end. Frank -- Frank Heckenbach, frank@g-n-u.de, http://fjf.gnu.de/, 7977168E GPC To-Do list, latest features, fixed bugs: http://www.gnu-pascal.de/todo.html GPC download signing key: ACB3 79B2 7EB2 B7A7 EFDE D101 CD02 4C9D 0FE0 E5E8