Search code examples
c++memory-managementmallocfree

What if, memory allocated using malloc is deleted using delete rather than free


I came across an issue which I could not resolve.

My question is, if I used malloc to allocate memory and then memory block is delete using delete? The general thumb rule is

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

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

Now, in order to check what happens if we do the reverse, I wrote a small code.

#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;

class A
{
  int p=10;
public:
  int lol() {
    return p;
  }
};

int main()
{
  int *a = (int *)malloc(sizeof(int)*5);
  for(int i=0; i<4; i++) {
    a[i] = i;
    cout << a[i] << endl;
  }

  delete(a);
  // Works fine till here..

  A b;
  cout << b.lol() << endl;
  free(b); // Causes error.     

  return 0;
}

The error which I get is:

error: cannot convert ‘A’ to ‘void*’ for argument ‘1’ to ‘void free(void*)’

I am unable to understand why is this happening. Please explain.


Solution

  • When you call delete a pointer, the compiler will call the dtor of the class for you automatically, but free won't. (Also new will call ctor of the class, malloc won't.)

    In you example, a char array apparently don't have a dtor, so delete does nothing but return the memory. That's why it's okay. (Or vise versa, new a char array and then free it.)

    But there can still be a problem: what if new and malloc are borrowing memory from different heap manager?

    Imagine that, you borrow money from people A, and return to people B later. Even if you are okay with that, have you ever consider A's feeling?

    BTW, you should use delete [] pArray; to free an array allocated using new[].