On 2/7/15 5:26 PM, H. S. Teoh via Digitalmars-d wrote:
On Sun, Feb 08, 2015 at 12:39:39AM +0000, bearophile via Digitalmars-d wrote:
Andrei Alexandrescu:

Such wrappers would allow safe code to use more C stdlib primitives.

I'd also like a safer templated wrapper for calloc() and malloc() and
similar.
[...]

You mean something like this?

        T* malloc(T)() @trusted
        {
                return cast(T*)malloc(T.sizeof);
        }

I think that would go as follows:

private @system T[] mallocUninitializedArrayImpl(T)(size_t n)
{
    auto p = malloc(n * T.sizeof);
    p || assert(0, "Not enough memory");
    return (cast(T*) p)[0 .. n];
}

@trusted T[] mallocUninitializedArray(size_t n)
if (!hasIndirections!T)
{
    return mallocUninitializedArrayImpl!T(n);
}

@system T[] mallocUninitializedArray(size_t n)
if (hasIndirections!T)
{
    return mallocUninitializedArrayImpl!T(n);
}

Similarly there'd be a mallocMinimallyInitializedArray that zeroes only pointers and is @trusted for all types.

Then we'd probably have a @trusted callocArray that blasts zeros throughout. It's @trusted because we know pointers are zeroes (an assumption somewhat not robust in theory but fine in practice).

Then we'd have a mallocArray that allocates an array and initializes each element with .init.

        struct MyStruct {
                int x, y, z;
        }

        void main() {
                auto p = malloc!MyStruct();

                // Not sure how to make free() usable from @safe, unless
                // we wrap the pointer returned by malloc().
                free(p);
        }

Indeed we have no safe way to wrap free.


Andrei

Reply via email to