error managing memory
I have a error in my code. I become on mac a incorrect checksum for freed object and under Linux a malloc error. Can somebody help me?
/* * Copyright 2010, The PLDesktop Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef PLBUFFER_H #define PLBUFFER_H #include #include #include #include #include namespace PLSDK { /** * Buffer for all parts of data. * * @ingroup tools_core */ template class PLBuffer : public virtual PLObject { public: /** * Constructor. */ PLBuffer() : PLObject(), m_capacity(0), m_count(0), m_data(0) {} /** * Constructor. * * @param size The size of the buffer. */ PLBuffer(pluint size); /** * Constructor. * * @param b Element to add to the buffer. */ PLBuffer(bufferT b); /** * Constructor. * * @param b Data to set into the buffer. * @param len Length of the data. */ PLBuffer(bufferT *b, pluint len); /** * Constructor. * * @param b Buffer to copy. */ PLBuffer(PLBuffer *b); /** * Constructor. * * @param b Buffer to copy. */ PLBuffer(const PLBuffer &b); /** * Destructor. */ virtual ~PLBuffer(); /** * Data from the buffer. * * @return Data from the buffer. */ inline bufferT *data() const; /** * The size of the buffer. * * @return The size of the buffer. */ inline pluint capacity() const; /** * How many parts are in the buffer. * * @return The number of parts that are in the buffer. */ inline pluint count() const; /** * Is the buffer a empty buffer. * * @return True if the buffer is empty. */ inline bool isEmpty() const; /** * Set the data as data from the buffer. * This delete all data that was set before. * * @param b Data to set. * @param len Length of the data to set. */ inline void setBuffer(bufferT *b, pluint len); /** * Clear the buffer and delete all memory that was mapped for the buffer. */ inline void clear(); /** * Don't delete the mapped data but set the size to null. So we overright all * data. */ inline void clean(); /** * Set all data to null and than set the size to null. So no data was in the ram * and we don't remap data. */ inline void secureClean(); /** * Append one data at the end of the buffer. * * @param d Data to append; */ inline void append(const bufferT d); /** * Append a array of data to the buffer. * * @param d Array of data. * @param len Length of the array of data. * @exception PLAppendEmptyElementException The length of the data are empty. */ inline void append(const bufferT *d, pluint len) throw(PLAppendEmptyElementException); /** * Append a buffer of data to the buffer. * * @param d Array of data. * @exception PLAppendEmptyElementException The length of the data are empty. */ inline void append(PLBuffer *d) throw(PLAppendEmptyElementException); /** * Append a buffer of data to the buffer. * * @param d Array of data. * @exception PLAppendEmptyElementException The length of the data are empty. */ inline void append(const PLBuffer &d) throw(PLAppendEmptyElementException); /** * Cut data out of the buffer. * * @param s Start point to cut. * @param e End point to cut. * @return The data that we cut out of the buffer. * @exception PLEmptyElementException The returnd value was a empty value. */ inline bufferT *cutData(pluint s, pluint e) throw(PLEmptyElementException); /** * Ends the data of the buffer with the data of another buffer? * * @param b Buffer to test. * @return True if the buffer ends with the data of the buffer b. */ inline bool endsWith(PLBuffer *b); /** * Ends the data of the buffer with the data of another buffer? * * @param b Buffer to test. * @return True if the buffer ends with the data of the buffer b. */ inline bool endsWith(const PLBuffer &b); /** * Get the data of a part from the buffer. * * @param s Startpoint of the part. * @param e Endpoint of the part. * @return The part of the buffer. */ inline bufferT *data(pluint s, pluint e); /** * Return a buffer with a part of this buffer. * * @param s Start point in the buffer. * @param e End point in the buffer. * @return The buffer with the part of the buffer. */ inline PLBuffer subPart(pluint s, pluint e); /** * Return the data at the point p. * * @param p Point for that you want the data. * @return The data at the position p. */ inline bufferT dataAt(pluint p); /** * Return the first index of a component. * * @param c The component to search for. * @param s Start position to search for. * @return The first index of the component c. * @exception PLIndexOutOfRangeException The start position was out of range. * @exception PLElementNotFoundException The element was not found in the buffer. */ inline int indexOf(bufferT c, pluint s = 0) throw(PLIndexOutOfRangeException, PLElementNotFoundException); /** * Return the first index of a buffer. * * @param c The buffer to search for. * @param s Start position to search for. * @return The first index of the component c. * @exception PLIndexOutOfRangeException The start position was out of range. * @exception PLElementNotFoundException The element was not found in the buffer. */ inline int indexOf(PLBuffer c, pluint s = 0) throw(PLIndexOutOfRangeException, PLElementNotFoundException); /** * Insert a component at the position p. * * @param c The component to add. * @param p Position where to add the component. */ inline void insertAt(bufferT c, pluint p); /** * Insert a component array at the position p. * * @param c The component array to add. * @param len The length of the component array. * @param p Position where to add the component. */ inline void insertAt(bufferT *c, pluint len, pluint p); /** * Find the last position of c. * * @param c Component to search for. * @param s Start position to start for. * @return The last position of c. * @exception PLIndexOutOfRangeException The start position was out of range. * @exception PLElementNotFoundException The element was not found in the buffer. */ inline int lastIndexOf(bufferT c, int s = -1) throw(PLIndexOutOfRangeException, PLElementNotFoundException); /** * Find the last position of c. * * @param c Component to search for. * @param s Start position to start for. * @return The last position of c. * @exception PLIndexOutOfRangeException The start position was out of range. * @exception PLElementNotFoundException The element was not found in the buffer. */ inline int lastIndexOf(PLBuffer c, int s = -1) throw(PLIndexOutOfRangeException, PLElementNotFoundException); /** * Insert a component at the beginning of the buffer. * * @param c Component to add. */ inline void prepend(bufferT c); /** * Insert a component at the beginning of the buffer. * * @param c Component to add. * @param len The length of the component. */ inline void prepend(bufferT *c, pluint len); /** * Prepend a buffer of data to the buffer. * * @param d Array of data. */ inline void prepend(PLBuffer *d); /** * Prepend a buffer of data to the buffer. * * @param d Array of data. */ inline void prepend(PLBuffer d); /** * Remove a part of the buffer. * * @param s Startpoint for the delete part. * @param e Endpoint for the delete part. */ inline void remove(pluint s, pluint e); /** * Array of components. * * @return The array of the components. */ inline bufferT *array(); /** * Write a component to the buffer. * It overright the existing component. * * @param p Position where to add the component. * @param c Component that you want to set. */ inline void write(pluint p, bufferT c); /** * Write a component array to the buffer. * It overright the existing component. * * @param p Position where to add the component. * @param c Component array that you want to set. * @param len Length of the component array. */ inline void write(pluint p, bufferT *c, pluint len); /** * Read the component from the position p. * * @param p Position of the component you want to read. * @return The component at the position p. */ inline bufferT read(pluint p); /** * Read the component from the position p. * * @param p Position of the component you want to read. * @param len The length of the component you want to read. * @return The component at the position p. */ inline bufferT *read(pluint p, pluint len); /** * Compare the buffer with another buffer data. * * @param data Buffer to compare to. * @return The compare result. */ inline PLCompareResult compareTo(PLBuffer data); /** * Contains the buffer a value. * * @param value The value to test for a match for. * @return True if the buffer contains the value. */ inline bool contains(bufferT value); /** * Contains the buffer another buffer data. * * @param data The data to test for a match for. * @param length The length of the data. * @return True if the buffer contains the buffer. */ inline bool contains(bufferT *data, pluint length); /** * Replace the part replace with the part with in this buffer. * * @param replace Part to search for. * @param with Part to replace with. */ inline void replaceAll(PLBuffer *replace, PLBuffer *with); /** * Operator for the direct access to the data. */ inline bufferT operator[](int pos); /** * Compare the buffer. */ inline bool operator == (PLBuffer data); /** * Compare the buffer. */ inline bool operator != (PLBuffer data); /** * Is the buffer smaler than another buffer. */ inline bool operator data); /** * Is the buffer lager than another buffer. */ inline bool operator > (PLBuffer data); /** * Copy the buffer. */ inline PLBuffer &operator =(const PLBuffer &buffer); protected: /** * Resize the buffer to the given size. * * @param c The size to resize to. */ void resize(pluint c) { if(m_data == 0) { m_data = new bufferT[c]; m_capacity = c; m_count = 0; return; } if(m_count + c > m_capacity) { bufferT *t = new bufferT[m_count + c]; if(m_data != 0) { for(pluint i = 0 ; i PLBuffer::PLBuffer(pluint size) : PLObject(), m_data(0), m_capacity(0), m_count(0) { if(size > 0) { m_data = new bufferT[size]; m_capacity = size; } } template PLBuffer::PLBuffer(bufferT b) : PLObject(), m_capacity(1), m_count(1) { m_data = new bufferT[1]; m_data[0] = b; } template PLBuffer::PLBuffer(bufferT *b, pluint len) : PLObject(), m_data(0), m_capacity(len), m_count(len) { if(len > 0) { m_data = new bufferT[len]; pluint i = 0; while(i PLBuffer::PLBuffer(PLBuffer *b) : PLObject(), m_data(), m_capacity(b->m_count), m_count(b->m_count) { if(b->m_count > 0) { m_data = new bufferT[b->m_count]; pluint i = 0; if(b->m_data != 0) { 开发者_如何学编程 while(i m_count) { m_data[i] = b->m_data[i]; i++; } } } } template PLBuffer::PLBuffer(const PLBuffer &b) : PLObject(), m_data(0), m_capacity(b.m_count), m_count(b.m_count) { if(b.m_count > 0) { m_data = new bufferT[b.m_count]; pluint i = 0; if(b.m_data != 0) { while(i PLBuffer::~PLBuffer() { if(m_data != 0) { delete m_data; m_data = 0; } } template bufferT *PLBuffer::data() const { return m_data; } template pluint PLBuffer::capacity() const { return m_capacity; } template pluint PLBuffer::count() const { return m_count; } template bool PLBuffer::isEmpty() const { return m_count == 0; } template void PLBuffer::setBuffer(bufferT *b, pluint len) { delete m_data; m_data = b; m_capacity = len; m_count = len; } template void PLBuffer::clear() { delete m_data; m_data = 0; m_capacity = 0; m_count = 0; } template void PLBuffer::clean() { m_count = 0; } template void PLBuffer::secureClean() { for(int i = 0 ; i void PLBuffer::append(const bufferT d) { resize(1); m_data[m_count] = d; m_count++; } template void PLBuffer::append(const bufferT *d, pluint len) throw(PLAppendEmptyElementException) { if(len void PLBuffer::append(PLBuffer *d) throw(PLAppendEmptyElementException) { if(d->count() m_data, d->m_count); } template void PLBuffer::append(const PLBuffer &d) throw(PLAppendEmptyElementException) { if(d.count() bufferT *PLBuffer::cutData(pluint s, pluint e) throw(PLEmptyElementException) { if(e - s == 0) { PL_EXCEPTION(PLEmptyElementException); } if(e >= m_count) { e = m_count - 1; } if(e > s) { plSwap(e, s); } bufferT *ret = data(s, e); remove(s, e); return ret; } template bool PLBuffer::endsWith(PLBuffer *b) { if(m_count - 1 - b->m_count m_count - 1; for(int i = m_count - 1 ; i >= m_count - 1 - b->m_count ; i--) { if(m_data[i] != b->m_data[j]) { return false; } j--; } return true; } template bool PLBuffer::endsWith(const PLBuffer &b) { return endsWith(&b); } template bufferT *PLBuffer::data(pluint s, pluint e) { if(e (e, s); } if(e - s == 0) { return 0; } if(e > m_count) { e = m_count; } bufferT *ret = new bufferT[e - s]; for(pluint i = 0 ; i PLBuffer PLBuffer::subPart(pluint s, pluint e) { return PLBuffer(data(s, e), e - s);; } template bufferT PLBuffer::dataAt(pluint p) { if(p int PLBuffer::indexOf(bufferT c, pluint s) throw(PLIndexOutOfRangeException, PLElementNotFoundException) { if(s >= m_count) { PL_EXCEPTION(PLIndexOutOfRangeException); } for(pluint i = s ; i int PLBuffer::indexOf(PLBuffer c, pluint s) throw(PLIndexOutOfRangeException, PLElementNotFoundException) { if(s + c.m_count > m_count) { PL_EXCEPTION(PLIndexOutOfRangeException); } for(pluint i = s ; i void PLBuffer::insertAt(bufferT c, pluint p) { resize(1); for(pluint i = m_count - 1 ; i >= p ; i--) { m_data[i + 1] = m_data[i]; } m_data[p] = c; m_count++; } template void PLBuffer::insertAt(bufferT *c, pluint len, pluint p) { resize(len); int i; for(i = m_count - 1; i >= p ; i--) { if(i int PLBuffer::lastIndexOf(bufferT c, int s) throw(PLIndexOutOfRangeException, PLElementNotFoundException) { if(s = m_count) { PL_EXCEPTION(PLIndexOutOfRangeException); } for(pluint i = s ; i >= 0 ; i--) { if(m_data[i] == c) { return i; } } PL_EXCEPTION(PLElementNotFoundException); } template int PLBuffer::lastIndexOf(PLBuffer c, int s) throw(PLIndexOutOfRangeException, PLElementNotFoundException) { if(s = m_count) { PL_EXCEPTION(PLIndexOutOfRangeException); } for(pluint i = s ; i > c.count() ; i--) { for(pluint j = 0 ; j > c.count() ; j++) { if(m_data[i + j] != c.m_data[j]) { break; } if(j == 0) { return i; } } } PL_EXCEPTION(PLElementNotFoundException); } template void PLBuffer::prepend(bufferT c) { insertAt(c, 0); } template void PLBuffer::prepend(bufferT *c, pluint len) { insertAt(c, len, 0); } template void PLBuffer::prepend(PLBuffer *d) { prepend(d->m_data, d->m_count); } template void PLBuffer::prepend(PLBuffer d) { prepend(d.m_data, d.m_count); } template void PLBuffer::remove(pluint s, pluint e) { pluint diff = e - s; if(diff == 0) { return; } if(diff (e, s); diff = e - s; } if(e > m_count) { e = m_count; } for(pluint i = s ; i bufferT *PLBuffer::array() { bufferT *b = new bufferT[m_count]; for(pluint i = 0 ; i void PLBuffer::write(pluint p, bufferT c) { if(p >= m_count) { resize(p - m_count); } m_data[p] = c; } template void PLBuffer::write(pluint p, bufferT *c, pluint len) { if(p + len >= m_count) { resize(p + len - m_count); } for(pluint i = 0 ; i bufferT PLBuffer::read(pluint p) { return dataAt(p); } template bufferT *PLBuffer::read(pluint p, pluint len) { return data(p, len); } template PLCompareResult PLBuffer::compareTo(PLBuffer data) { if(m_count == data.m_count) { for(pluint i = 0 ; i data.m_data[i]) { return PLCompareResultBigger; } } return PLCompareResultSame; } return PLCompareResultSmaller; } template void PLBuffer::replaceAll(PLBuffer *replace, PLBuffer *with) { for(int i = 0 ; i m_data[0]) { for(int j = 0 ; j m_count ; j++) { if(i + j > m_count) { return; } if(j == replace->m_count - 1 && m_data[i + j] != replace->m_data[j]) { remove(i, i + replace->m_count - 1); insertAt(with->m_data, with->m_count - 1, i); } else if(m_data[i + j] != replace->m_data[j]) { break; } } } } } template bool PLBuffer::contains(bufferT value) { for(int i = 0 ; i bool PLBuffer::contains(bufferT *data, pluint length) { int j; for(int i = 0 ; i bufferT PLBuffer::operator[](int pos) { return m_data[pos]; } template bool PLBuffer::operator == (PLBuffer data) { return compareTo(data) == PLCompareResultSame; } template bool PLBuffer::operator != (PLBuffer data) { return compareTo(data) != PLCompareResultSame; } template bool PLBuffer::operator data) { return compareTo(data) == PLCompareResultSmaller; } template bool PLBuffer::operator > (PLBuffer data) { return compareTo(data) == PLCompareResultBigger; } template PLBuffer &PLBuffer::operator =(const PLBuffer &b) { if(m_data == 0) { delete m_data; } m_data = new bufferT[b.m_count]; m_capacity = b.m_count; m_count = b.m_count; pluint i = 0; if(b.m_data != 0) { while(i
Can somebody help me? All code you can find under http://code.google.com/p/pldesktop/
Run your code under valgrind
on Linux - that should take you straight to the bug.
精彩评论