Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why not raise EInvalidPointer?

The Delphi documentation states :

Never raise an EInvalidPointer exception directly. EInvalidPointer is raised internally by the memory manager.

I'm writing a custom base class as an alternative to TInterfacedObject, following the RTL implementation as closely as possible, and see, by example, that TInterfacedObject in the RTL implements BeforeDestruction as:

procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);  
end;

Where Error(reInvalidPtr) raises EInvalidPointer through a variety of unit-scoped methods local to the RTL.

If I'm writing my own class, how should I implement BeforeDestruction? Why not do this? :

procedure TMyInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    raise EInvalidPointer.CreateRes(@SInvalidPointer) at ReturnAddress;
end;

Is there something special with the global InvalidPointer exception object declared in SysUtils? If this is a bad idea, would it be sensible to simply raise a custom exception here?

like image 642
J... Avatar asked Dec 20 '16 18:12

J...


People also ask

What does invalid pointer mean?

An invalid pointer reference occurs when a pointer's value is referenced even though the pointer doesn't point to a valid block. One way to create this error is to say p=q;, when q is uninitialized. The pointer p will then become uninitialized as well, and any reference to *p is an invalid pointer reference.

What does invalid pointer operation mean in Delphi?

Invalid pointer operations occur when you tell the Delphi memory manager to release memory that doesn't belong to it. There are three ways that might happen: Freeing a pointer or object that has already been freed.

WHAT IS NULL pointer in C?

Null pointersA null pointer has a reserved value that is called a null pointer constant for indicating that the pointer does not point to any valid object or function. You can use null pointers in the following cases: Initialize pointers. Represent conditions such as the end of a list of unknown length.


2 Answers

Complementary to David's answer; what's special about InvalidPointer, which is used to raise an EInvalidPointer, together with OutOfMemory <-> EOutOfMemory is explained in more detail in the documentation topic for their ascendant EHeapException:

EHeapException is the exception class for errors related to heap-allocated memory.

EHeapException's descendants—EOutOfMemory and EInvalidPointer—are used to handle failed allocations of dynamic memory and invalid pointer operations.

Note: Memory for these exceptions is pre-allocated whenever an application starts and remains allocated as long as the application is running. Never raise EHeapException or its descendants directly.

Which amounts to I guess is, it may not be safe to allocate memory for creating these errors once you have problems with memory: for lack of it or possible corruption...

like image 62
Sertac Akyuz Avatar answered Sep 22 '22 11:09

Sertac Akyuz


Sidestepping the original question, you can avoid asking it simply by using the same code as the runtime:

System.Error(reInvalidPtr);
like image 31
David Heffernan Avatar answered Sep 26 '22 11:09

David Heffernan