У меня ошибка в моем коде. Я получаю на Mac неправильную контрольную сумму для освобожденного объекта, а в Linux - ошибку malloc. Кто-нибудь может мне помочь?
/*
* 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.<br>
* 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.<br>
* 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
Может ли кто-нибудь мне помочь? Весь код вы можете найти под http://code.google.com/p/pldesktop/