Если вы собираетесь разместить новое место, вам нужно сделать это в необработанной памяти. Что-то вроде:
template class CyclicalArray {
private:
T* mem_ptr;
public:
CyclicalArray(size_t capacity, const T& default_value) {
this->default_value = default_value;
this->capacity = capacity;
head_index = 0;
mem_ptr = reinterpret_cast<T*>(::new char[capacity * sizeof(T)]); //memory allocating
for(T* p = mem_ptr; p < mem_ptr + capacity; ++p) {
::new (p) T (default_value); //initialization
}
}
~CyclicalArray() {
// this
for(T* p = mem_ptr + capacity; p != mem_ptr; --p) {
(p-1)->~T();
}
delete[] reinterpret_cast<char*>(mem_ptr);
}
В противном случае вы будете называть T деструктор дважды на одной и той же памяти объекта (не очень хорошая вещь, чтобы сделать).
Кроме того, так как ваши p
указателей типа T*
, вы можете выполнять простой инкремент/декремент на нем - компилятор будет иметь дело с проблемой sizeof(T)
как обычный курс арифметики указателей.
Наконец, строго говоря, вы должны уничтожить элементы массива в порядке убывания (противоположность конструкции).
Я надеюсь, что это поймает большинство или все ошибки.
Возможно, вы действительно захотите использовать что-то вроде std :: vector в качестве магазина. Ниже приведен пример с использованием std::vector<>
(с несколькими другими исправлениями синтаксиса). Я не уверен, если ваш класс действительно нужна копия default_value
или head_index
- я оставил их в предположении, что вы планируете использовать их в других методах:
#include <vector>
template <typename T>
class CyclicalArray {
private:
std::vector<T> backing_store;
T default_value;
size_t head_index;
public:
CyclicalArray(size_t capacity, const T& def_val) :
backing_store(capacity, def_val),
default_value(def_val),
head_index(0) {
}
~CyclicalArray() {}
};
Обратите внимание, как много проще конструктор и деструктор поскольку вся сложность вашего первого класса управляется std:vector
.
Если я не ошибаюсь, уродство можно скрыть, используя 'std :: allocator' и 'allocate (capacity)', 'construct (p, default_value)', 'destroy (p)' и 'deallocate (mem_ptr, емкость) '? –
UncleBens