The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
Google UNIX.COM



View Single Post in UNIX Forums - Click on the Thread or Permalink to View Entire Thread -->
  #1 (permalink)  
Old 05-17-2006
norsk hedensk norsk hedensk is offline
Registered User
 

Join Date: Jul 2002
Location: new york
Posts: 1,025
*** glibc detected *** double free or corruption: 0x40236ff4 ***

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 */

Last edited by norsk hedensk; 05-18-2006 at 08:21 AM.
Reply With Quote
Forum Sponsor