Глубокое копирование в блок c-массива в куче

Рассмотрим, например, класс контейнера шаблона, который содержит буфер, который размещен в куче:

T *_buffer = new T[SIZE]

Просто простой указатель на массив c типа T.

Этот класс является шаблонным. Однако у меня есть проблемы с выполнением глубокой копии объекта в мой буфер.

В моем модульном тесте я настроил тестовый класс:

class test
{
public:
int* _ptrInt;
test() {_ptrInt = nullptr;}
test(const int i)
{
_ptrInt = new int;
*_ptrInt = i;
}
test(const test& other)
{
_ptrInt = new int;
*_ptrInt = *other._ptrInt;
}
~test()
{
delete _ptrInt;
}
};

в моем контейнере я вызываю set, передавая временные данные:

container.set(0, test(5));

// destructor called on copy immediately after statement, invalidating deep copy in buffer
void set (const int& index, const T& data)
{
int i = realign(index);
T copy = data;
_buffer[i==SIZE?i-1:i] = copy;   // ternary statement and index work
}

однако _buffer принимает копию в качестве ссылки, в тот момент, когда копия выходит из области видимости, она удаляет тот же указатель, который содержится в _buffer. Я пытаюсь заставить _buffer назначить по значению. Но мне не повезло.

  • memcpy по-прежнему копирует указатели, чтобы указывать на тот же адрес
  • конструктор тестовой копии корректно вызывается
  • семантика перемещения потребовала бы, чтобы класс имел конструктор перемещения
  • std :: vector как-то реализует это для правильного копирования, будь то его T / T *, куча / стек, с / без конструктора перемещения, поэтому я знаю, что это должно быть возможно

Есть ли способ, которым я могу назначить по значению _buffer в куче?

0

Решение

Вы являются «присвоение по значению». Тем не менее, ваш test класс не реализует оператор присваивания operator=Таким образом, назначение вызывает сгенерированный компилятором оператор присваивания по умолчанию, который просто копирует элемент за элементом. Отсюда и проблемы с мелким назначением.

Кроме того, ваш конструктор копирования взорвется, если other._ptrInt является nullptr,

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector