Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does using malloc in method, free in main work?

Tags:

c++

malloc

I have the following question:

If I use malloc in a method, return the pointer to my main, and free the pointer in my main, do i have successfully freed the memory or not? And is this bad programming style, if i do so?

int* mallocTest(int size)
{
    int * array = (int*) malloc(size);
    return array;
}

int main ()
{
    int* pArray = mallocTest(5);
    free (pArray);
    return 0;
}

EDIT: The main purpose of this question is that I want to know, if I freed the memory successfully (if i use the right "combination" of malloc-free/new[]-delete[]) when i split this into the method and the main function!

EDIT2: Changed code and topic, to lead to the intended point of the question

like image 779
print x div 0 Avatar asked Feb 20 '14 09:02

print x div 0


People also ask

Do you have to free after using malloc?

But the memory allocation using malloc() is not de-allocated on its own. So, “free()” method is used to de-allocate the memory. But the free() method is not compulsory to use.

Is malloc automatically freed?

This will happen automatically. You do not need to write anything for this.

What will happen if you keep using malloc () but never free ()?

It becomes a problem when you write functions (other than main) that allocate memory without freeing it, and without making it available to the rest of your program. Then your program continues running with that memory allocated to it, but no way of using it.

What will happen if I allocate memory using malloc and free it using free or allocate using new and free it using Delete?

If we allocate memory using malloc, it should be deleted using free. If we allocate memory using new, it should be deleted using delete.


2 Answers

Mixing malloc freeing it with delete is explained in other answers.

I feel you want to know if malloc memory allocated in a method, return the pointer to main, and free the pointer in main will work or not ? Yes it can be done and free will clear the memory allocated in other methods provided you have the pointer pointing to that location.

like image 151
Sunil Bojanapally Avatar answered Oct 09 '22 03:10

Sunil Bojanapally


No. Use free to free memory allocated with malloc, delete for single objects allocations with new and delete [] when using new on arrays.

Mixing and matching may appear to work (it's undefined behaviour, and "undefined" included "works fine" and "sort of works fine most of the time, but crashes on thursdays in months starting with M on days that are divisible with 3 or 7 and the operator has shirt with stripes") - and may indeed work on SOME types of systems, but fail on others, depending on exactly how malloc and new and their respective free and delete functions are implemented.

It is fine to call a function that returns a pointer to some memory that is later freed with the appropriate call. It is "nicer" if you actually implement a pair of functions, where one allocates and the other destroys the data. This is particularly important if the data-structure allocated isn't trivial (e.g. you have allocations inside the outer allocation).

Also consider what happens if you decide that "Oh, I'd like to use new int[size]; instead of malloc(size * sizeof(int)); in the mallocTest()". Now every place that calls mallocTest() will have to change so that it calls delete [] instead of free that you corrected it to after reading this answer.

[Just spotted that your code is broken, and probably won't compile, certainly won't allocate space: (int *)malloc[size]; doesn't do what you want it to do, and I'm pretty sure is illegal, as indexing a function is invalid]

And finally, the "best" solution is wrap all allocations in an object, such that the destructor of that object destroys the data allocated within the object. So, for example, use std::vector<int> instead of allocating with malloc.

like image 33
Mats Petersson Avatar answered Oct 09 '22 04:10

Mats Petersson