Удаление объектов с членами кучи
Я работаю над реализацией bitset. Битовый набор использует массив unsigned long long
хранить биты.
class bitset{
typedef unsigned long long uint64;
uint64* bits;
...
}
Поскольку мне нужен этот набор битов для хранения большого объема данных, я считаю, что он лучше всего работает при инициализации массива uint64
с использованием new
Ключевое слово, чтобы построить его в куче.
bitset::bitset(int n_bits){
if (n_bits % 64 !=0) size (n_bits / 64) + 1;
else size = n_bits / 64;
this->data = new uint64[size];
}
Выполнение do позволяет моей программе последовательно разрешать всей моей программе доступ к массиву битов. Одна проблема, с которой я сталкиваюсь, заключается в том, что мой деструктор не может удалить данные
bitset::~bitset(){
delete[] this->data;
}
Работая без деструктора, я получаю утечку памяти (как и ожидалось), с деструктором я получаю ошибку времени выполнения Error in `./a.out': double free or corruption (out):
Я попытался погуглить это безрезультатно. Я довольно новичок в C++, поэтому любая оценка поведения стека / кучи в классах приветствуется.
1 ответ
Вы можете использовать векторный контейнер:
class bitset{
...
std::vector<uint64> bits;
...
Vector заботится о распределении памяти, чтобы у вас не возникало проблем со случайным удалением памяти более одного раза или случайной утечкой памяти.
PS unsigned long long
не гарантированно будет точно 64 бита. Это может быть больше, чем это. Если это важная деталь для вашей программы, то вы должны использовать std::uint64_t
вместо стандартной библиотеки вместо. Это в основном относится только к будущей совместимости.