Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

return pointer with new operator. Where to put delete?

Im fairly new to C++.

So I learned that new allocates memory and returns a pointer of my datatype. But can I use this in a function and return the pointer? If so then where should I place the delete operator?

Is the following code legal?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

int *makeArray(int size)
{
    int *result = new int[size];

    delete[] result;
    return result;
}

int main()
{
    int *pointer = makeArray(10);
    /* code ... */
    return 0;
}

It is compiling and working but logically it makes no sense because I deleted my array.

So I tried the following:

int *makeArray(int size)
{
    int *result = new int[size];

    return result;
}

int main()
{
    int *pointer = makeArray(10);
    /* code ... do some stuff with pointer */
    delete[] pointer;
    return 0;
}

Is this safe or does it cause a memory leak? Is there a better way of returning the pointer?

I tried both versions and they are compiling and working but I’m sure at least one of them if not both are unsafe.

>Solution :

Is the following code legal?

int *makeArray(int size)
{
    int *result = new int[size];

    delete[] result;
    return result;
}

int main()
{
    int *pointer = makeArray(10);
    /* code ... */
    return 0;
}

Definitely not! This is Undefined behavior because you return a deleted pointer. After using the delete operator you’re telling your OS that it can release the memory and use it for whatever it wants. Reading or writing to it is very dangerous (Program crashing, Bluescreen, Destruction of the milky way)

int *makeArray(int size)
{
    int *result = new int[size];

    return result;
}

int main()
{
    int *pointer = makeArray(10);
    /* code ... do some stuff with pointer */
    delete[] pointer;
    return 0;
}

Is this safe or does it cause a memory leak?

Yes this is the correct way of using the new and delete operator. You use new so your data stays in memory even if it gets out of scope. Anyway it’s not the safest code because for every new there has to be a delete or delete[] you can not mix them.

Is there a better way of returning the pointer?

YES. It’s called Smart Pointer. In C++ programmers shouldn’t use new but smart pointer at all. There is a C++ community Coding Guideline to avoid these calls Guideline R11

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading