Рассмотрим, например, класс контейнера шаблона, который содержит буфер, который размещен в куче:
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 назначить по значению. Но мне не повезло.
Есть ли способ, которым я могу назначить по значению _buffer в куче?
Вы являются «присвоение по значению». Тем не менее, ваш test
класс не реализует оператор присваивания operator=
Таким образом, назначение вызывает сгенерированный компилятором оператор присваивания по умолчанию, который просто копирует элемент за элементом. Отсюда и проблемы с мелким назначением.
Кроме того, ваш конструктор копирования взорвется, если other._ptrInt
является nullptr
,
Других решений пока нет …