Jimmy_Rustle
Jimmy_Rustle

Reputation: 329

Deleting a dynamic array after it has been returned from a function

I am new to C++ and paranoid of memory leaks. I'll strip my code down to just the important bits:

If I have a function like this:

char * myString = "Discombobulate";

char * ToUppercase()
{
    int length = strlen(myString);
    char * duplicateString = new char [length];
    strcpy(duplicateString, myString);
    //char arithmetic to turn every letter in duplicateString to uppercase
    return duplicateString;
}

Obviously, I need to perform a delete[] to avoid memory leaks. Now what I wanted to know is if I can do the delete in main(), like so:

int main () {
char * result = Upper();

std::cout << result << std::endl;

delete[] result;
}

Will this work properly? Is there any catch to doing it like this?

Upvotes: 2

Views: 1797

Answers (3)

user2982029
user2982029

Reputation: 84

YEs you can delete it the way you have... By the way, you can also assign memory for the pointer and pass that as a parameter to the function and delete it after it returns from the function.

char * duplicateString = new char [length + 1];

ToUppercase(char* duplicateString );

if( duplicateString ){ delete []duplicateString  ; duplicateString  = NULL;}

Upvotes: 1

songyuanyao
songyuanyao

Reputation: 173044

Now what I wanted to know is if I can do the delete in main()

Yes, you can and you should.

BTW1: Think about using std::string, std::vector, smart pointers, to avoid such kind of manual memory management, since it's c++.

BTW2:

char * duplicateString = new char [length];

should be

char * duplicateString = new char [length + 1];

The last position will be used for the terminating null character '\0'.

Upvotes: 5

Weak to Enuma Elish
Weak to Enuma Elish

Reputation: 4637

Will this work properly?

Yes. As long as it is a valid pointer, you could delete it outside of the function that called new. Should you? Well...

Is there any catch to doing it like this?

Yes. It's bad practice. You're allocating resources in a function and expecting the caller to clean them up. It goes against RAII, as people in the comments have explained. Along with the advice to use std::string (do use it), you can use std::unique_ptr and friends instead of raw pointers.

Upvotes: 2

Related Questions