when i try to use the class i wrote, i either get this:
*** glibc detected *** double free or corruption: 0x40236ff4 ***
and the proccess exits with an error code of 0;
or it segfaults. could someone look at my header file (with imp.) to give me some insight as to why its not working?
Code:
#ifndef _DYNAMICARRAY_H
#define _DYNAMICARRAY_H
/*****
Written by Joseph Oldak
May 2006
*****/
using namespace std;
template <class T>
class Dynamicarray
{
public:
Dynamicarray();
Dynamicarray(int s);
~Dynamicarray();
void add(T elem);
T get_val(int loc); // returns first element if element requested does not exist.
void erase(int loc); // location
T * init_ptr();
int size();
private:
int Size;
T * buffer;
T * ptr;
};
template <class T>
Dynamicarray<T>::Dynamicarray()
{
Size = 0;
ptr = init_ptr();
//ptr = new T[Size];
}
template <class T>
Dynamicarray<T>::Dynamicarray(int s)
{
Size = s;
ptr = init_ptr();
//ptr = new T[Size];
}
template <class T>
Dynamicarray<T>::~Dynamicarray()
{
if(ptr != NULL)
{
delete[] ptr;
ptr = NULL;
}
if(buffer != NULL)
{
delete[] buffer;
buffer = NULL;
}
}
template <class T>
T* Dynamicarray<T>::init_ptr()
{
return new (nothrow) T[Size];
}
template <class T>
void Dynamicarray<T>::add(T elem)
{
int sbuffer;
buffer = new T[Size+1];
sbuffer = Size+1;
for (int i = 0; i < Size; i ++)
{
buffer[i] = ptr[i];
}
delete ptr;
Size = sbuffer;
buffer[Size-1] = elem;
ptr = new T[Size];
for(int i = 0; i < Size; i ++)
{
ptr[i] = buffer[i];
}
delete[] buffer;
buffer = NULL;
}
template <class T>
T Dynamicarray<T>::get_val(int loc)
{
if (loc > Size)
{
return ptr[0];
}
return ptr[loc];
}
template <class T>
void Dynamicarray<T>::erase(int loc)
{
if(get_val(loc) != -1)
{
int sbuffer;
buffer = new T[Size-1];
sbuffer = Size-1;
for(int i = 0; i < loc; i++)
{
buffer[i] = ptr[i];
}
for(int i = loc+1; i < Size; i++)
{
buffer[i] = ptr[i];
}
Size = sbuffer;
for(int i = 0; i < Size; i++)
{
ptr[i] = buffer[i];
}
delete[] buffer;
buffer = NULL;
}
}
template <class T>
int Dynamicarray<T>::size()
{
return Size;
}
#endif /* _DYNAMICARRAY_H */