Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/articles/cpp-tutorials/)
-   -   Difference Between malloc/free & new/delete (http://www.go4expert.com/articles/difference-malloc-free-delete-t29232/)

Trinity 29Oct2012 17:23

Difference Between malloc/free & new/delete
 
In C, memory allocations on heap are done using following three library methods
Code:

      void *malloc(size_t size);
      void *calloc(size_t nmemb, size_t size);
      void *realloc(void *ptr, size_t size);

Though, most commonly used is
Code:

malloc()
The corresponding free-ing the memory method is
Code:

void free(void *ptr);
Talking about C++, although all C dynamic memory allocation methods work, still it offers a different set which is
Code:

new
for dynamically allocating the memory and
Code:

delete
for free-ing up the memory. Both of these are operator and not methods. though.

The Difference Between malloc/free and new/delete



Even if we talk about C++ programming, malloc/free are widely used for allocating memory dynamically, besides new/delete. It is because, both vary in the way they do their job of memory allocation, and are efficient to use in their own specific case. Some major differences between the two being:
  • As already stated, malloc/free are library methods, whereas new/delete are C++ operators
  • malloc/free just returns the pointer to allocated memory chunk, whereas new/delete allocates and calls the constructor/destructor for the particular object.
  • In case of malloc/free, the return pointer needs to be typecasted, but no such typecasted required in case if new/delete
  • Interestingly, new/delete operators can be overloaded by the user (a C++ concept), however malloc/free methods cannot be overridden.
Considering the above points, malloc/free are well suited in cases involving C-structs, basic data types, however where objects of classes are involved, new/delete operators are better suited. Howsoever, these is not a hard and fast rule, and can have variations depending upon certain things as per the programming requirements.

Implementation Examples



Here is an example showcasing malloc/free in a simple C program
Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING "myLinuxBook"
int main()
{
    int len;
    char *sptr = NULL;

    len = strlen(STRING);
    sptr = (char*) malloc (len *sizeof(char)); //dynamic memory allocation
    if (sptr == NULL)
    {
        printf("Error in  memory allocation\n");
    }
    else
    {
        strncpy(sptr, STRING, len+1);
        printf("String is %s\n", sptr);
    }

    if (sptr)
        free(sptr);
    sptr = NULL;
   
    return 0;
}

The Output:
Code:

String is myLinuxBook
Alongwith here is an example illustrating where new/delete can be used.
Code:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 30
#define DEFAULT "Standard"

using namespace std;

class MyNode
{
    private:
    int data;
    char name[MAX];

    public:
    MyNode()
    {
        data = 0;
        strncpy(name, DEFAULT, strlen(DEFAULT));
        printf("In Consructor\n");
    }

    ~MyNode()
    {
        printf("In Destructor\n");
    }

    void display()
    {
        printf("Name = %s  Data = %d\n", name, data);
    }

};

int main()
{
    MyNode *node = new MyNode();
    node->display();
    delete node;
    return 0;
}

The Output
Code:

In Constructor
Name = Standard  Data = 0
In Destructor

Caveat



Very important point, one cannot use malloc() to allocate memory and delete to free the memory. Similarly, allocating using new and freeing using free() is incorrect. The reason being, the implementations of malloc() and operator delete which uses some metadata values being stored in some specific memory pool to determine which memory address and what size of memory to free. Hence, only free() implementation knows how to understand the metatdata by malloc() and only delete understands the one by new.


All times are GMT +5.5. The time now is 22:11.