Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ dynamic memory allocation using "new"

I'm new to C++, trying to learn by myself (I've got Java background).

There's this concept of dynamic memory allocation that I can assign to an array (for example) using new.

In C (and also in C++) I've got malloc and realloc that are doing that. In C++ they've added the new for some reason I can't understand.

I've read a lot about the difference between a normal array that goes to the stack while the dynamic allocated array goes to the heap.

So what I understand is that by using new I'm allocating space in the heap which will not be deleted automatically when finished a function let's say, but will remain where it is until I finally, manually free it.

I couldn't find practical examples of using the dynamic memory allocation over the normal memory.

  1. It's said that I can't allocate memory through runtime when using normal array. Well, probably I didn't understand it right because when I tried to create a normal array (without new) with a capacity given as an input by the user (like arr[input]), it worked fine.

here is what I mean:

int whatever;
cin>>whatever;

int arr2[whatever];

for (int i = 0; i < whatever; i++) {
    arr2[i]=whatever;
    cout<<arr2[i];

}
  1. I didn't really understand why it's called dynamic when the only way of extending the capacity of an array is to copy it to a new, larger array.

I understood that the Vector class (which I haven't yet learned) is much better to use. But still, I can't just leave that gap of knowledge begin and I must understand why exactly it's called dynamic and why should I use it instead of a normal array. Why should I bother freeing memory manually when I can't really extend it but only copy it to a new array?

like image 363
Jacob.B Avatar asked Aug 01 '14 21:08

Jacob.B


People also ask

Is new used for dynamic memory allocation?

Dynamic memory allocation using the new operatorTo allocate the space dynamically, the operator new is used. It means creating a request for memory allocation on the free store. If memory is available, memory is initialized, and the address of that space is returned to a pointer variable.

How do you dynamically allocate memory in C?

C malloc() method The “malloc” or “memory allocation” method in C is used to dynamically allocate a single large block of memory with the specified size. It returns a pointer of type void which can be cast into a pointer of any form.

What is dynamic memory allocation explain new and delete?

C++ allows us to allocate the memory of a variable or an array in run time. This is known as dynamic memory allocation. In other programming languages such as Java and Python, the compiler automatically manages the memories allocated to variables. But this is not the case in C++.

Is dynamic memory allocation possible in C?

The concept of dynamic memory allocation in c language enables the C programmer to allocate memory at runtime. Dynamic memory allocation in c language is possible by 4 functions of stdlib. h header file.


2 Answers

When you know the size of an array at compile time you can declare it like this and it will live on the stack:

int arr[42];

But if you don't know the size at compile time, only at runtime, then you cannot say:

int len = get_len();
int arr[len];

In this case you must allocate the array at runtime. In this case the array will live on the heap.

int len = get_len();
int* arr = new int[len];

When you no longer need that memory you need to do a delete [] arr.

std::vector is a variable size container that allows you to allocate and reallocate memory at runtime without having to worry about explicitly allocating and freeing it.

int len = get_len();
std::vector<int> v(len); // v has len elements
v.resize(len + 10); // add 10 more elements to the vector
like image 57
Marius Bancila Avatar answered Oct 04 '22 02:10

Marius Bancila


For static allocation, you must specify the size as a constant:

  MyObj  arrObject[5];

For dynamic allocation, that can be varied at run-time:

  MyObj  *arrObject = new MyObj[n];

The different between new and malloc is that new will call the ctor for all those objects in the array, while malloc just gives you raw memory.

like image 25
James Curran Avatar answered Oct 04 '22 01:10

James Curran