Почему мой собственный подкласс std::allocator имеет нулевой размер, чего здесь не хватает?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему мой собственный подкласс std::allocator имеет нулевой размер, чего здесь не хватает?

Сообщение Anonymous »

Код состоит из следующего:

Код: Выделить всё

_Vector_impl
: std::allocator, имитирующий std::vector или контейнер stl. Это наш пользовательский контейнер, хранящий ссылку на набор данных (входной массив или контейнер stl): std::allocator, который имитирует std::vector или контейнер stl. р>

Код: Выделить всё

wrapRawArray
: функция для преобразования массива[] в наш собственный контейнер

Код: Выделить всё

#include 
#include 
#include 
using namespace std;

template
struct _Vector_base
{
struct _Vector_impl : public _Alloc
{
_Tp* _M_start;
_Tp* _M_finish;
_Tp* _M_end_of_storage;

// etc
};
// etc
};

template
using vectorType = vector;

template
using vectorImpl = typename _Vector_base::_Vector_impl;

template
bool wrapRawArray(T(&_array)[N], vectorType* _container)
{
vectorImpl* vectImpl = (vectorImpl*)((void*)_container);
vectImpl->_M_start = _array;
vectImpl->_M_finish = vectImpl->_M_end_of_storage = vectImpl->_M_start + N;

return true;
}

template
void releaseRawArray(vectorType* _container) {
vectorImpl* vectImpl = (vectorImpl*)((void*)_container);
vectImpl->_M_finish = vectImpl->_M_end_of_storage = vectImpl->_M_start = nullptr;
}

template
class ProxyContainer
{
Container* container{ nullptr };
size_t size;
bool isRawArray{ false };
static string errorMessage;

public:
explicit ProxyContainer(Container& _container)
:container(&_container), size(_container.size()), isRawArray(false) {}
template
explicit ProxyContainer(T(&_array)[N])
:container(new Container) {
size = N;
isRawArray = wrapRawArray(_array, container);
}

~ProxyContainer() {
if (isRawArray) {
releaseRawArray(container);
if (container) {
delete container;
container = nullptr;
}
}
}
T& operator[](size_t index) {
if (index >= size) {
throw out_of_range(ProxyContainer::errorMessage
+ to_string(index));
}
return container->at(index);
}
void changeModel(Container& _container) {
container = &_container;
size = _container.size();
isRawArray = false;
}
};

int main()
{
// Raw array
int arr[] = { 1,2,3 };
ProxyContainer proxyForRawArray(arr);

proxyForRawArray[1] = 9; // throws out of bound error, the code shows runtime error at stl  file line 1906 where at() function break due to container is sized 0 and input index is 1.
}
Очевидная проблема заключается в классе _Vector_impl, который не реализует распределитель. Впервые используя этот класс std::allocator, я понятия не имею, что нужно переопределить или сделать.

Подробнее здесь: https://stackoverflow.com/questions/786 ... -missing-h
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»