Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ dynamic array without STL

Tags:

c++

arrays

This is part of an assignment however I just asking for clarification:

Load data from ATM.txt and store them in a dynamic array (ATM type, not STL) when the program starts up.

How exactly do I do dynamic arrays without STL? I thought perhaps the assignment means using pointers, the "ATM Type" threw me off.

It's mentioned again:

file accounts.txt into a dynamic array (Account type, not STL)

--not part of Assignment

I've never understood the use of memory unsafe operations, eg pulling the number of items in a file from the first line:

eg.

5
abc
def
hij
kml
mno

Wouldn't it be smarter to use STL (vectors, or C++11 arrays) and not rely on the number in the file as it may not be accurate causing buffer overflows etc?

//Edit Define a class Account in a file Account.h which contains the data members: customer id, BSB number, etc.

I assume Account and ATM types are those classes.

like image 313
user1617478 Avatar asked Oct 07 '22 20:10

user1617478


2 Answers

The most basic form of dynamic array is one created using new[], and destroyed using delete[]:

ATM * atms = new ATM[count];
// do stuff with the array
delete [] atms;

However, this brings the danger that the code using the array might throw an exception, return from the function, or otherwise prevent the delete[] from happening. If that happens, then you will lose the only pointer to the allocated memory, and it will remain allocated but inaccessible; this is known as a memory leak. For this reason, it's better to wrap the array in a class, with:

  • member variables to store a pointer to the array, and (optionally) its size
  • constructors and/or functions to allocate the array
  • a destructor to delete the array
  • (optionally) function(s) to resize the array

Deleting the allocation in an object's destructor uses the principle of RAII to ensure that the array is deleted once it is no longer needed.

This leaves one more danger: if you copy this array object, then you will end up with two objects that both try to delete the same array, which is disasterous. To prevent this, you'll need to consider the Rule of Three. Either write a copy constructor and copy-assignment operator to allocate a new array and copy the contents; or delete them. (If you're learning old-fashioned C++, then you can't delete member functions, so you'll have to declare them private and not implement them instead).

Wouldn't it be smarter to use STL?

Usually, yes. But if you're learning C++, it's a good idea to understand how memory management works, as well as how to get the library to handle it for you. That's probably part of the point of this exercise.

like image 135
Mike Seymour Avatar answered Oct 13 '22 10:10

Mike Seymour


A common approach for this kind of assignment would be to simulate the auto-expanding behavior of a vector on your own. Allocate an array for your data on the heap, and keep track of its length and the number of items you've stored in the array.

Once you've filled the array with your data, expand the maximum size by some amount and allocate a new array. This allows you to copy the data from the old array into the new array, and then continue adding items until you run out of space again.

like image 29
derekerdmann Avatar answered Oct 13 '22 09:10

derekerdmann