У меня техническая проблема, и она меня действительно смущает.Я заранее прошу прощения, потому что, возможно, я не даю соответствующие детали;Я пока не понимаю, почему это не так, и было бы излишне включать весь код, с которым я работаю.
Я работаю с большой программой, использующей ST ++ C ++.Я перевожу этот код в очень чувствительную среду без стандартного клиба или внедрения STL;он переопределит malloc / free / new / delete и т. д. Для этого мне нужно заменить std :: parts на мои собственные упрощенные реализации.Я начал с std :: vector.Прямо сейчас он работает в стандартной экосистеме, поэтому это GNU libc и STL.Единственное, что изменилось, - это векторный класс.
Когда я выполняю программу с замененным классом, она вызывает ошибки.Я поместил это через GDB и обнаружил, что программа будет запрашивать объект из вектора, используя оператор индекса.Когда возвращается ссылка на объект, вызывается метод, и программа вызывает ошибки.Кажется, он не может найти этот метод и заканчивается в main_arena () в GDB.Тип объекта - унаследованный класс.
Я действительно не совсем уверен, в чем здесь проблема.Я хотел бы предоставить дополнительную информацию, но я не уверен, что еще я могу дать.Я могу только предположить, что что-то не так с моей векторной реализацией, потому что ничего в программе не изменилось.Может быть, есть что-то очевидное, что я делаю что-то не так, чего я вообще не вижу.
Я использую: g ++ (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)
Буду очень признателен за любые отзывы / советы!
#ifndef _MYSTL_VECTOR_H_
#define _MYSTL_VECTOR_H_
#include <stdlib.h>
#include <assert.h>
typedef unsigned int uint;
namespace mystl
{
/******************
VECTOR
********************/
template <typename T>
class vector
{
private:
uint _size;
uint _reserved;
T *storage;
void init_vector(uint reserve)
{
if (reserve == 0)
{
_reserved = 0;
return;
}
storage = (T*)malloc(sizeof(T)*reserve);
assert(storage);
_reserved = reserve;
}
public:
vector()
{
// std::cerr << "default constructor " << this << std::endl;
storage = NULL;
_size = 0;
_reserved = 0;
}
vector(const vector<T> &other)
{
// std::cerr << "copy constructor " << this << std::endl;
storage = NULL;
_size = 0;
_reserved = 0;
init_vector(other.size());
_size = other.size();
for (uint i=0; i<other.size(); i++)
{
storage[i] = T(other[i]);
}
}
vector(uint init_num, const T& init_value)
{
// std::cerr << "special constructor1 " << this << std::endl;
storage = NULL;
_size = 0;
_reserved = 0;
init_vector(init_num);
for (size_t i=0; i<init_num; i++)
{
push_back(init_value);
}
}
vector(uint init_num)
{
// std::cerr << "special constructor2 " << this << std::endl;
storage = NULL;
_size = 0;
_reserved = 0;
init_vector(init_num);
}
void reserve(uint new_size)
{
if (new_size > _reserved)
{
storage = (T*)realloc(storage, sizeof(T)*new_size);
assert(storage);
_reserved = new_size;
}
}
void push_back(const T &item)
{
if (_size >= _reserved)
{
if (_reserved == 0) _reserved=1;
reserve(_reserved*2);
}
storage[_size] = T(item);
_size++;
}
uint size() const
{
return _size;
}
~vector()
{
if (_reserved)
{
free(storage);
storage = NULL;
_reserved = 0;
_size = 0;
}
}
// this is for read only
const T& operator[] (unsigned i) const
{
// do bounds check...
if (i >= _size || i < 0)
{
assert(false);
}
return storage[i];
}
T& operator[] (unsigned i)
{
// do bounds check...
if (i >= _size || i < 0)
{
assert(false);
}
return storage[i];
}
// overload = operator
const vector<T>& operator= (const vector<T>& x)
{
// check for self
if (this != &x)
{
_reserved = 0;
_size = 0;
storage = NULL;
init_vector( x.size() );
for(uint i=0; i<x.size(); i++)
{
storage[i] = T(x[i]);
}
_size = x.size();
}
return *this;
}
uint begin() const
{
return 0;
}
void insert(uint pos, const T& value)
{
push_back(value);
if (size() == 1)
{
return;
}
for (size_t i=size()-2; i>=pos&& i>=0 ; i--)
{
storage[i+1] = storage[i];
}
storage[pos] = value;
}
void erase(uint erase_index)
{
if (erase_index >= _size)
{
return;
}
//scoot everyone down by one
for (uint i=erase_index; i<_size; i++)
{
storage[i] = storage[i+1];
}
_size--;
}
void erase(uint start, uint end)
{
if (start > end)
{
assert(false);
}
if (end > _size)
end = _size;
for (uint i=start; i<end; i++)
{
erase(start);
}
assert(false);
}
void clear()
{
erase(0,_size);
}
bool empty() const
{
return _size == 0;
}
}; //class vector
}
#endif // _MYSTL_VECTOR_H_