Ok, one final (double) question then...
a) is this is the case for pure (i.e., without OO) Pascal?
Strings, other than shortstrings, are reference-counted. Ditto dynamic arrays plus a couple of other things.
By any stretch of the imagination, they're "pure" Pascal.
var
s1: string[255]; // Not reference counted
s2: string; // Reference counted.
s3: ansistring; // Reference counted, not Unicode.
a1: array[0..65535] of byte; // Not reference counted.
a2: array of byte; // Reference counted.
Classes are instantiated onto the heap, and you have to do a manual .Create() and .Free.
Records etc. are generally on the stack, and are subject to the normal rules of scope and visibility.
Records etc. may also be allocated from the heap (1970s-style Pascal programming), whereupon they need to be freed manually.
b) any alternative to propose (not C)?
By and large, Pascal (without overuse of OO) is... pretty good. There's some things I'm unhappy about: overuse of OO when a record or something global would do, sloppy type casting, forced use of the newly-introduced generics facility (which generally only shows up when you get into deep debugging) and so on.
I'm watching Rust with interest, but I'm unhappy about the way in which it moves away from the ALGOL programming model where visibility was determined by scope; a lot of what it's doing was tackled successfully by Pascal/Modula-2/Ada years ago particularly when one looks at Pascal's "var", "const" and "out" parameter qualifiers.
So, I think it's fair to say that if I did "know a better 'ole" I'd go to it.
MarkMLl